AVR code aan PIC

C

crocklip

Guest
Hoi,

Ik kwam onlangs in een schematische in PCS
de schematische gewelf naam "digitale tuner gitaar".De code die is geschreven voor een Atmel 2323 chip.Nu heres het ding: Ik wil gebruik maken van hetzelfde idee voor een PIC16f877a chip dus ik heb geprobeerd om alle instructies aan een PIC georiënteerd programma!ben ik gek?
Ik gebruikte de hex-bestand uit een PIC compiler die ik gebruik en gesimuleerd met behulp van het programma "PIC simulator IDE 'en niet erg verrassend dat
didnt werk.Ik zou waarschijnlijk zijn overleden schokken als het wel!
Hoe dan ook, ik heb de originele code en de gewijzigde code.Ik zou zeer dankbaar zijn als iemand zou kunnen wijzen waar ik
heb fout gegaan.Misschien iets te maken met de positie in het programma van de overflow accu (lijn 80)?
Nu, als gij kan waarschijnlijk vertellen van de code dat de programmering is niet mijn sterke punt, dus excuses bij voorbaat!

Hoop te horen van iemand snel!

Dave/ / originele code

* // *

Gewone Digital Guitar Tuner
---------------------------
versie 1.0 2001-02-12 jesperPIN Opdrachten op de 2323

PB0 Hoog LED

PB1 Input pin

PB2 Laag Led

* /#
include <io.h>
#
include <signal.h>
# define F_CPU 11059200 / / CPU klokfrequentie
# define PRESCALER 64 / / CPU prescaler waarde# define BASE_FREQUENCY (F_CPU / PRESCALER) / / frequentie teller

# define TUNING_FORK_A 440,0 / / "base" Een
# define NOTE_DIFF 1.05946309436 / / de 12'th root van 2# define E_STRING 164,81 / / top string (1)
# define A_STRING 220,00
# define D_STRING 293,66
# define G_STRING 391,99
# define B_STRING 493,88
# define EH_STRING 659,26 / / onderkant string (6)/ / De gitaar nota span
/ / # # # # # # # # # #
/ / EF GA BC D EF GA BC DE
/ / 1 2 3 4 * 5 6
/ /

unsigned int Center_Count [] = / / opzoeken tabel;.
(
BASE_FREQUENCY / EH_STRING, / / Hoge E
BASE_FREQUENCY / B_STRING, / / B
BASE_FREQUENCY / G_STRING, / / G
BASE_FREQUENCY / D_STRING, / / D
BASE_FREQUENCY / A_STRING, / / A
BASE_FREQUENCY / E_STRING, / / Laag E
);

unsigned int Transition_Count [] = / / opzoeken tabel
(
BASE_FREQUENCY / (B_STRING (EH_STRING-B_STRING) / 2), / / E naar B
BASE_FREQUENCY / (G_STRING (B_STRING-G_STRING) / 2) / / B tot en met G
BASE_FREQUENCY / (D_STRING (G_STRING-D_STRING) / 2), / / G tot en met D
BASE_FREQUENCY / (A_STRING (D_STRING-A_STRING) / 2), / / D tot A
BASE_FREQUENCY / (E_STRING (A_STRING-E_STRING) / 2) / / A tot E
);
vluchtige unsigned char count_hi / / overflow accu

/ /
/ / timer 0 overflow interrupt
/ /
SIGNAL (SIG_OVERFLOW0)
(
count_hi / / increment overflow tellen
)//------------------------------------------------ ----------------------------
/ / Main Lupe
//------------------------------------------------ ----------------------------int main (void)
(
unsigned int i;
unsigned int count;//------------------------------
/ / Initialiseer
//------------------------------

CBI (DDRB, 1); / / PB1 wordt ingevoerd
CBI (PORTB, 1); / / nee pullups actiefsbi (DDRB, 0); / / PB0 is Ouput, Hoge LED
sbi (DDRB, 2); / / PB2 is Ouput, Laag-LEDoutp (0x03, TCCR0); / / prescaler ingesteld op f/64 (172,8 kHz@11.0592 MHz)

sbi (TIMSK, TOIE0); / /
enable interrupt op timer overflow
asm volatile ( "sei"); / /
Global Interrupt Enable//------------------------------------------------ ----------------------------
/ / Laat dingen los
//------------------------------------------------ ----------------------------while (1) / / lus te
(
count = 0; / / duidelijke monster tellen
loop_until_bit_is_set (PINB, 1); / / wacht tot er iets gebeurt

/ / Heeft een hoge rand
/ / Start bemonstering

outp (0, TCNT0); / / duidelijke counter
count_hi = 0; / / heldere hi tellen/ / Monster lus

for (i = 0; i <32; i )
(
while (bit_is_set (PINB, 1)) / / negeren hi-> lo rand overgangen
if (count_hi> 80) / / overslaan als er geen rand wordt gezien binnen
break; / / een redelijke termijn

while (bit_is_clear (PINB, 1)) / / wachten op lo-> hi rand
if (count_hi> 80) / / overslaan als er geen rand wordt gezien binnen
break; / / een redelijke termijn

count = (count_hi << INP (TCNT0); / / get tegenwaarde
outp (0, TCNT0); / / duidelijke counter

if (count_hi> 80) / / overslaan als teller heeft opgelopen een
break; / / te hoge waarde

count_hi = 0; / / heldere hi tellen
)
/ / Aanvankelijk uitschakelen beide leds
sbi (PORTB, 0);
sbi (PORTB, 2);

if (count_hi <= 80) / / indien count is redelijk
(

count = count>> 5 / / gemiddelde cumulatieve telling door met 32

/ / Nu hebben we bij het vinden van de juiste snaar

/ / Go via overgang frequenties

for (i = 0; i <sizeof (Transition_Count) / sizeof (Transition_Count [0]); i )
(
if (count <Transition_Count ) / / stoppen indien deze lager is dan deze overgang tellen
break;
)

/ / I nu de string index

/ / Controleren of de telling voor een wedstrijd, waardoor
/ / 1 extra tellen "hysteresis" om te
/ / Veel lampje flikkeren

if (count-1 <= Center_Count ) / /
if count <= deze string tellen
CBI (PORTB, 0); / / light "Too High" LED

if (count 1> = Center_Count ) / /
if count> = deze string tellen
CBI (PORTB, 2); / / light "Te laag" LED
)
))
-------------------------------------------------- -----------------------------------
/ / Changed code#
include <pic.h>
#
include <htc.h>

# define F_CPU 20000000 / / CPU klokfrequentie
# define PRESCALER 64 / / CPU prescaler waarde# define BASE_FREQUENCY (F_CPU / PRESCALER) / / frequentie teller

# define TUNING_FORK_A 440,0 / / "base" Een
# define NOTE_DIFF 1.05946309436 / / de 12'th root van 2# define E_STRING 164 / / top string (1)
# define A_STRING 220,00
# define D_STRING 293,66
# define G_STRING 391,99
# define B_STRING 493,88
# define EH_STRING 659,26 / / onderkant string (6)/ / De gitaar nota span
/ / # # # # # # # # # #
/ / EF GA BC D EF GA BC DE
/ / 1 2 3 4 * 5 6
/ /

unsigned int Center_Count [] = / / opzoeken tabel;.
(
BASE_FREQUENCY / EH_STRING, / / Hoge E
BASE_FREQUENCY / B_STRING, / / B
BASE_FREQUENCY / G_STRING, / / G
BASE_FREQUENCY / D_STRING, / / D
BASE_FREQUENCY / A_STRING, / / A
BASE_FREQUENCY / E_STRING, / / Laag E
);

unsigned int Transition_Count [] = / / opzoeken tabel
(
BASE_FREQUENCY / (B_STRING (EH_STRING-B_STRING) / 2), / / E naar B
BASE_FREQUENCY / (G_STRING (B_STRING-G_STRING) / 2) / / B tot en met G
BASE_FREQUENCY / (D_STRING (G_STRING-D_STRING) / 2), / / G tot en met D
BASE_FREQUENCY / (A_STRING (D_STRING-A_STRING) / 2), / / D tot A
BASE_FREQUENCY / (E_STRING (A_STRING-E_STRING) / 2) / / A tot E
);
vluchtige unsigned char count_hi / / overflow accu

/ /
/ / timer 0 overflow interrupt
/ // / if (TMR0IF = 1)
/ / (
/ / count_hi ;
/ /) / / Increment overflow tellen
/ / TMR0IF = 0;//------------------------------------------------ ----------------------------
/ / Main Loop
//------------------------------------------------ ----------------------------

int main (void)

(

vluchtige unsigned char count_hi / / overflow accu
unsigned int i;
unsigned int count;

///////////////////////////////////////////////
if (TMR0IF = 1)
(
count_hi = (count_hi 1);
TMR0IF = 0;
)
/////////////////////////////////////////////////

//------------------------------
/ / Initialiseer
//------------------------------

RD4 = 1;
TRISB = 0x02; / / RB1 wordt ingevoerd
/ / PB0 is Ouput, Hoge LED
/ / PB2 is Ouput, Laag-LED
RB1 = 0 / / geen pullups actief

T0CS = 0; / /
enable TMR0
PS2 = 1; / / prescaler ingesteld om 1:64 (Voor 2323 slechts 172,8 kHz@11.0592 MHz)
PS1 = 0; / / '' '' '' '' '' '
PS0 = 1; / / '' '' '' '' '' '
PSA = 0; / / SET PRESCALER AAN TMR0
TMR0IE = 1; / /
enable interrupt op timer overflow
GIE = 1; / /
Global Interrupt Enable//------------------------------------------------ ------------------------
/ / Tune
//------------------------------------------------ ------------------------
while (1) / / lus te
(count = 0;while (1)
(
if (RB1 = 1)
break;
) / / Wacht tot er iets gebeurt

/ / Heeft een hoge rand
/ / Start bemonstering

TMR0 = 0x00; / / duidelijke counter
count_hi = 0; / / heldere hi tellen/ / Monster lus

for (i = 0; i <32; i )
(

while (RB1 = 1) / / negeren hi-> lo rand overgangen
if (count_hi> 80) / / overslaan als er geen rand wordt gezien binnen
break; / / een redelijke termijn

while (RB1 = 0) / / wachten op lo-> hi rand
if (count_hi> 80) / / overslaan als er geen rand wordt gezien binnen
break; / / een redelijke termijn

count = (count_hi << (TMR0); / / get tegenwaarde
TMR0 = 0x00; / / duidelijke counter

if (count_hi> 80)
/ / Overslaan als teller heeft opgelopen een
break; / / te hoge waarde

count_hi = 0; / / heldere hi tellen
)
/ / Aanvankelijk uitschakelen beide leds
RB0 = 0;
RB2 = 0;

if (count_hi <= 80) / / indien count is redelijk
(

count = count>> 5 / / gemiddelde cumulatieve telling door met 32

/ / Nu hebben we bij het vinden van de juiste snaar

/ / Go via overgang frequenties

for (i = 0; i <sizeof (Transition_Count) / sizeof (Transition_Count [0]); i )
(
if (count <Transition_Count ) / / stoppen indien deze lager is dan deze overgang tellen
break;
)

/ / I nu de string index

/ / Controleren of de telling voor een wedstrijd, waardoor
/ / 1 extra tellen "hysteresis" om te
/ / Veel lampje flikkeren

if (count-1 <= Center_Count ) / /
if count <= deze string tellen
RB0 = 1 / / licht "Too High" LED

if (count 1> = Center_Count ) / /
if count> = deze string tellen
RB2 = 1 / / licht "Te laag" LED

if (count 1 == Center_Count ) / /
if count = deze string tellen
RB1 = 0; / / EQUAL!
RB2 = 1;
)

))

 
Ik stuitte op dezelfde avr bron voor het tunen van mijn gitaar.Ik heb geen avr of pic.Ik wil ten uitvoer te leggen op at89c51 ... dus plz vertellen waar in de bron-bestand moet ik hebben om aanpassingen door te voeren om te branden in de code at89c51 microcontroller?

bedankt

 
hier
is de code voor at89c51.
Ik gebruik timer 1 te genereren 173khz interne klok
Ik gebruik de ckt en de code in Proteus ... de code niet werkt, zelfs ik heb precies frequecies voor strijkorkest uit freq generator ..

plz plz help meToegevoegd na 15 minuten:hier
is de code/ / originele code
/ *

Gewone Digital Guitar Tuner
---------------------------
versie 1.0 2001-02-12 jesperPIN Opdrachten op de 2323

PB0 Hoog LED

PB1 Input pin

PB2 Laag Led

* /#
include <reg51.h>sbit input = P1 ^ 1;
sbit led1 = P1 ^ 0;
sbit led2 = P1 ^ 2;# define F_CPU 11059200 / / CPU klokfrequentie
# define PRESCALER 64 / / CPU prescaler waarde# define BASE_FREQUENCY (F_CPU / PRESCALER) / / frequentie teller 172800

# define TUNING_FORK_A 440,0 / / "base" Een
# define NOTE_DIFF 1.05946309436 / / de 12'th root van 2# define E_STRING 164,81 / / top string (1)
# define A_STRING 220,00
# define D_STRING 293,66
# define G_STRING 391,99
# define B_STRING 493,88
# define EH_STRING 659,26 / / onderkant string (6)/ / De gitaar nota span
/ / # # # # # # # # # #
/ / EF GA BC D EF GA BC DE
/ / 1 2 3 4 * 5 6
/ /

unsigned int Center_Count [] = / / opzoeken tabel
(
BASE_FREQUENCY / EH_STRING, / / Hoge E 262
BASE_FREQUENCY / B_STRING, / / B-350
BASE_FREQUENCY / G_STRING, / / G 441
BASE_FREQUENCY / D_STRING, / / D 588
BASE_FREQUENCY / A_STRING, / / A 785
BASE_FREQUENCY / E_STRING, / / Laag E 1048
);

unsigned int Transition_Count [] = / / opzoeken tabel
(
BASE_FREQUENCY / (B_STRING (EH_STRING-B_STRING) / 2), / / E naar B
BASE_FREQUENCY / (G_STRING (B_STRING-G_STRING) / 2) / / B tot en met G
BASE_FREQUENCY / (D_STRING (G_STRING-D_STRING) / 2), / / G tot en met D
BASE_FREQUENCY / (A_STRING (D_STRING-A_STRING) / 2), / / D tot A
BASE_FREQUENCY / (E_STRING (A_STRING-E_STRING) / 2) / / A tot E
);
vluchtige unsigned char count_hi / / overflow accu

/ /
/ / timer 0 overflow interrupt
/ /

/ *
SIGNAL (SIG_OVERFLOW0)
(
count_hi / / increment overflow tellen
)
* /void timer1_ISR (void) onderbreken 3
(
count_hi ;
)
//------------------------------------------------ ----------------------------
/ / Main Lupe
//------------------------------------------------ ----------------------------void main (void)
(
unsigned int i;
unsigned int count;

P1 = 0x00;
/*--------------------------------------
Stel Timer1 voor 8-bit timer met herlaadbeurt
(mode 2).De timer telt tot 255,
overflows, is geladen met 156, en
genereert een interrupt.

Stel de Timer1 Uitvoeren controle bit.
--------------------------------------*/
TMOD = (TMOD & 0x0F) | 0x20 / * Stel Mode (8-bit timer met herlaadbeurt) * /
Th1 = 250; / * Herlaad TL1 rekenen 100 klokken * /
TL1 = Th1-1;
ET1 = 1; / * Enable Timer 1 Interrupts * /
TR1 = 1; / * Start Timer 1 Running * /
EA = 1; / * Global Interrupt Enable * ///------------------------------
/ / Initialiseer
//------------------------------

/ *
% CBI (DDRB, 1); / / PB1 wordt ingevoerd
CBI (PORTB, 1); / / nee pullups actiefsbi (DDRB, 0); / / PB0 is Ouput, Hoge LED
sbi (DDRB, 2); / / PB2 is Ouput, Laag-LEDoutp (0x03, TCCR0); / / prescaler ingesteld op f/64 (172,8 kHz@11.0592 MHz)

sbi (TIMSK, TOIE0); / /
enable interrupt op timer overflow
% vluchtige asm ( "sei"); / /
Global Interrupt Enable
* ///------------------------------------------------ ----------------------------
/ / Laat dingen los
//------------------------------------------------ ----------------------------while (1) / / lus te
(
count = 0; / / duidelijke monster tellen
/ / loop_until_bit_is_set (PINB, 1); / / wacht tot er iets gebeurt
if (input == 1)
/ / Heeft een hoge rand
/ / Start bemonstering

/ /% outp (0, TCNT0); / / duidelijke counter
(
TL1 = Th1-1;
)

count_hi = 0; / / heldere hi tellen/ / Monster lus

for (i = 0; i <32; i )
(
while (input == 1) / / negeren hi-> lo rand overgangen
if (count_hi> 80) / / overslaan als er geen rand wordt gezien binnen
break; / / een redelijke termijn

while (input == 0) / / wachten op lo-> hi rand
if (count_hi> 80) / / overslaan als er geen rand wordt gezien binnen
break; / / een redelijke termijn

/ / count = (count_hi << INP (TCNT0); / / get tegenwaarde
count = count_hi <<5;

/ /% outp (0, TCNT0); / / duidelijke counter
Th1 = 250;
TL1 = Th1-1;if (count_hi> 80) / / overslaan als teller heeft opgelopen een
break; / / te hoge waarde

count_hi = 0; / / heldere hi tellen
)

/ / Aanvankelijk uitschakelen beide leds
/ /% sbi (PORTB, 0);
led1 = 0;

/ /% sbi (PORTB, 2);
led2 = 0;
if (count_hi <= 80) / / indien count is redelijk
(

count = count>> 5 / / gemiddelde cumulatieve telling door met 32

/ / Nu hebben we bij het vinden van de juiste snaar

/ / Go via overgang frequenties

for (i = 0; i <(sizeof (Transition_Count) / sizeof (Transition_Count [0])); i )
(
if (count <Transition_Count ) / / stoppen indien deze lager is dan deze overgang tellen
break;
)
/ / I nu de string index
/ / Controleren of de telling voor een wedstrijd, waardoor
/ / 1 extra tellen "hysteresis" om te
/ / Veel lampje flikkeren
if ((count-1)> = Center_Count )
/ / count = tellen 0;
/ / Indien count <= deze string tellen
/ /% CBI (PORTB, 0); / / light "Too High" LED
led1 = 1;

if ((count 1)> = Center_Count )
/ / count = tellen 0;
led2 = 1;
/ /
If count> = deze string tellen
/ /% CBI (PORTB, 2); / / light "Te laag" LED
)
)
)plz controleren op fouten en laat het me weten

 

Welcome to EDABoard.com

Sponsor

Back
Top