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 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;
)
))