Sida 1 av 2
Timer med 16F628
Postat: 14 januari 2007, 13:21:38
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
Postat: 14 januari 2007, 13:27:48
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...
Postat: 14 januari 2007, 13:54:41
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.
Postat: 14 januari 2007, 14:27:17
av bengt-re
Aha, det spar en hel del tankemöda...
Postat: 14 januari 2007, 14:37:10
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.
Postat: 14 januari 2007, 15:47:01
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.
Postat: 14 januari 2007, 17:10:26
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
Postat: 14 januari 2007, 19:16:54
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.
Postat: 14 januari 2007, 22:54:03
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.
Postat: 14 januari 2007, 22:58:48
av bengt-re
ja sen skriver du bara w till portb
Postat: 14 januari 2007, 23:01:18
av newbadboy
ja jo jag kom på det själv, det gick lätt och snabbt
Postat: 14 januari 2007, 23:08:45
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å...

Postat: 15 januari 2007, 11:59:36
av XorXaX
Det finns exempel med i installationen av mikroC om hur du kan styra 7-seg.
Postat: 15 januari 2007, 12:16:49
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
Postat: 15 januari 2007, 15:50:47
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);
}
}