Timer med 16F628
Timer med 16F628
Jaha då var det dags igen.
Ska bygga en timer med 628an. Till portB har jag anslutit en 7seg display. Det jag inte är riktig klar över är hur jag ska tända dessa segment på lämpligt sätt. Ok... jag kan gå in på varje pinne och sätta ett värde typ "PORTB.F0=1" för varje händelse men detta blir snabbt osmidigt känns det som. Antar att det är väl ngn lösning med en matris eller ngt som är bäst??!! Använder för övrigt MikroC
Timern skall i slutändan styra en UV-låda
Ska bygga en timer med 628an. Till portB har jag anslutit en 7seg display. Det jag inte är riktig klar över är hur jag ska tända dessa segment på lämpligt sätt. Ok... jag kan gå in på varje pinne och sätta ett värde typ "PORTB.F0=1" för varje händelse men detta blir snabbt osmidigt känns det som. Antar att det är väl ngn lösning med en matris eller ngt som är bäst??!! Använder för övrigt MikroC
Timern skall i slutändan styra en UV-låda
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:
Tja, anslut de sju segmenten till alla displayer och ha en portlinje per display till GA eller GK. Multiplexa dessa hela tiden i en interup eller i mainloopen - vill du ha timerinterupt för tidsräknaren så kan det blir lite stökigt att köra med dubbla interupter. Den har väl bara en 16 bitars timer 628án har jag för mig, men går ju att lösa om man klurar lite.
Jag hade (utan att helt tänkt igenom problemet) använd 16 bitars timern till klocka och uppdaterad displayerna i mainloopen. Antar att Sodjan skriker över en sådan lösning
Men det fungerar...
Jag hade (utan att helt tänkt igenom problemet) använd 16 bitars timern till klocka och uppdaterad displayerna i mainloopen. Antar att Sodjan skriker över en sådan lösning

Så min fråga är ju eg... iom jag ex räknar ner från 9-0 så vill jag ju inte för varje siffra ange varje pinne vilket värde det ska ha för att rätt siffra skall visas. Utan jag vill i början av programmet definiera exakt hur varje siffra ser utt med avseende på portb utgångar. Sen vill jag bara varsomhelst anropa ex "koden" för en siffra.
- JimmyAndersson
- Inlägg: 26586
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
Använde en sån lösning i mitt gamla projekt som visade vad som kom ut på serieporten på en dubbel alfanumerisk LED-display.
Jag lagrade bytes i eepromet som visade tecknen 0-F när de matades ut på PortB. När en byte kom in användes värdet på denna som offset, skickades till exempel en 5a så hämtades värdet från basadressen+5.
Jag lagrade bytes i eepromet som visade tecknen 0-F när de matades ut på PortB. När en byte kom in användes värdet på denna som offset, skickades till exempel en 5a så hämtades värdet från basadressen+5.
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:

Observera bara att om du inte har alla satta till utgångar på aktuell port så kan du få oväntade värden i W, det står i databladet, men lika bra att påpeka det - troligen kör du hela porten till 7-segmentaren iaf.
Du kan ju räkna till 15 om du vill - styr du 7 segmentaren fritt så kan du alltid skriva AbCde också...

Sist jag använda en 7seg display gjorde jag en enkel funktion.
Tyvärr i Basic.. men, men
Tyvärr i Basic.. men, men
Kod: Markera allt
Get7SegD:
If Char = 0 Then D_data = &B11111010
If Char = 1 Then D_data = &B10000010
If Char = 2 Then D_data = &B11011001
If Char = 3 Then D_data = &B11001011
If Char = 4 Then D_data = &B10100011
If Char = 5 Then D_data = &B01101011
If Char = 6 Then D_data = &B01111011
If Char = 7 Then D_data = &B11000010
If Char = 8 Then D_data = &B11111011
If Char = 9 Then D_data = &B11101011
Return
Det går fakstist att sätta hela portb tull utgångar. Sedan kan jag ex bara skriva PORTB = 0xB0, detta motsvarar en trea, skitenkelt. Dock har jag ett värre problem än så.
Det är att jag inte kan styra PORTB med hjälp av porta som ingångar. Kolla koden nedan. Om jag i while satsen sätter en etta istället så växlar displayen mellan en 3a och en 6a. Men om jag har som i detta fallet Porta.F3 så går den aldrig in whilesatsen. Den ignorerar helt vad som finns på ingången på porta. Har jag glömt stänga av ngn funktion som stör eller??
void main(){
VRCON = 0x00;
CMCON = 0x07;
TRISA = 1;
TRISA.F1 = 0;
TRISB = 0;
while(PORTA.F3){
PORTB = 0x83;
delay_ms(1000);
PORTB = 0xB0;
delay_ms(1000);
}
}
Det är att jag inte kan styra PORTB med hjälp av porta som ingångar. Kolla koden nedan. Om jag i while satsen sätter en etta istället så växlar displayen mellan en 3a och en 6a. Men om jag har som i detta fallet Porta.F3 så går den aldrig in whilesatsen. Den ignorerar helt vad som finns på ingången på porta. Har jag glömt stänga av ngn funktion som stör eller??
void main(){
VRCON = 0x00;
CMCON = 0x07;
TRISA = 1;
TRISA.F1 = 0;
TRISB = 0;
while(PORTA.F3){
PORTB = 0x83;
delay_ms(1000);
PORTB = 0xB0;
delay_ms(1000);
}
}
Senast redigerad av newbadboy 17 januari 2007, 20:35:10, redigerad totalt 1 gång.