Timer med 16F628

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Timer med 16F628

Inlägg av newbadboy »

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
Användarvisningsbild
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:

Inlägg av bengt-re »

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...
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

Nu är det ju lite enklare än så tror jag, kommer bara att ha en enda 7segmentare. DVS kommer bara att visa 0-9min.
Användarvisningsbild
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:

Inlägg av bengt-re »

Aha, det spar en hel del tankemöda...
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

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.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

En lösning är då att man gör någon form av tabeller. Ungefär såhär:

Om Siffra = 1
{
Pinne1 = 1
Pinne2 = 0
Pinne3 = 0
osv..
}

Om Siffra = 2
{
Pinne 1 = ...osv


Minns inte hur man gör det i C.
Användarvisningsbild
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:

Inlägg av bengt-re »

varför inte bara:


siffran i W

Hoppa PC+w
retlw ox12(binärmönsterat som skall lägga ut till 7-segmentaren)
retlw ox12
retlw ox12
retlw ox12
retlw ox12
retlw ox12
Användarvisningsbild
MadModder
Co Admin
Inlägg: 31539
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Inlägg av MadModder »

Kan man inte styra en hel port (8 pinnar) direkt genom att peta ut en byte?
Isf räcker det ju med en per siffra.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Inlägg av PHermansson »

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.
Användarvisningsbild
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:

Inlägg av bengt-re »

ja sen skriver du bara w till portb
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

ja jo jag kom på det själv, det gick lätt och snabbt
Användarvisningsbild
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:

Inlägg av bengt-re »

;)

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å... ;)
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Inlägg av XorXaX »

Det finns exempel med i installationen av mikroC om hur du kan styra 7-seg.
Användarvisningsbild
anlamotte
Inlägg: 859
Blev medlem: 5 augusti 2003, 15:54:34
Ort: Stockholm
Kontakt:

Inlägg av anlamotte »

Sist jag använda en 7seg display gjorde jag en enkel funktion.
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
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

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

}

}
Senast redigerad av newbadboy 17 januari 2007, 20:35:10, redigerad totalt 1 gång.
Skriv svar