Hallo zusammen, für ein Projekt möchte ich folgendes realisieren: An den kompletten PORTB erfolgt die Eingabe (z.B per DIP_Schalter). An PORTA erfolgt die Ausgabe per LED's. Die LED's an PORTA sollen blinken. Wenn am PORTB nun überall eine logisch "1" anliegt, dann sollen die LED's schnell blinken. Wenn an RB0 nur eine "1" anliegt, sollen die LED's ganz langsam blinken. Also zusammengefasst, durch eine höhere Wertigkeit an PORTB sollen die LED's schneller blinken und durch eine niedrigere Wertigkeit langsammer. Ich dachte mir, ich baue die ganze Geschichte mit dem Timer/Vorteiler auf. Ich kann dort zwischen max. 8 Vorteilern auswählen. Wenn ich nun sage, dass 0..32 = 1.Vorteiler ist (langsam) & 32..64= 2. Vorteiler (etwas schneller) usw.... bis 255, dann könnte man doch dementsprechend die Frequenz beeinflussen. Könnte da jemand helfen oder hat einen geschickteren/einfacheren Vorschlag? Für jeden Vorschlag bin ich recht dankbar.
Ist m. E. nicht praktikabel, da der Vorteiler direkt am Oszillator hängt. Machbar ist es aber. Der TMR0 muss trotzdem ausgewertet werden, z.B. mit Interrupt bei Überlauf. Ich würde den Vorteiler einen festen Wert geben und nur mit dem Timer arbeiten. Der Timer löst einen Interrupt aus, das TMR0-Register wird direkt mit dem Inhalt von PortB geladen und PortA getoggelt. Je höher der Wert im PortB und damit im TimerReg, umso schneller läuft die Schleife und blinken die LEDs. Ein Problem bei der Sache ist jedoch, dass das langsamste Blinken 256 mal so lange dauert, wie das schnellste. Das könnte man jedoch umgehen, wenn man PortB entsprechend auswertet und den Timer mit sinnvollen Werten lädt. Qurzfrequenz z. B. 32kHz, bei höheren Frequenzen sind weitere Zeitschleifen via Software nötig.
Ich nehme mal 4Mhz OSC an. Dann würde ich den TMR0 mit 128 Vorteiler nehmen, macht ca 30.5 hz. Bei jedem TMR0 toggelst du die Led, also sind das ca 15Hz Blinkfrequenz. Ok, du machst folgendes, ich schreibe es dir in C innerhal des ISR. if (!PORTB) LED_OFF; // mindestens eine Eins, else if (!interval--) { interval=~PORTB; LED_INV; // macro }
Hallo...danke erstmal für die schnelle Antwort. @ Chris: Kannst du mir das vllt in Assemblersprache des PICS aufschreiben? Und wie soll das dann funktionieren, dass er mit dem Inhalt von PortB schneller oder langsamer läuft? Es muss doch dann eigentlich so sein, dass die Frequenz erhöt wird.
In assembler wird das gleich, aber anstatt !--interval wird ++interval verwendet, und mit dem overflow gearbeitet. Basic assembler, keine hidden ports (read-modify-write Problem), keine Macros. #define LED PORTA,0 interval equ 0x20 ; example ram definition test 6 ; if (!PORTB) skpnz ; { bcf LED ; LED_OFF skpnz ; } else do { incfsz interval ; if (++interval) { goto $+5 ; break; } movfw 6 movwf interval ; interval=PORTB; movlw 1 ; LED_INV xorwf 6 ; } while (0);
sorry, Tippfehler!!! interval equ 0x20 ; example ram definition test 6 ; if (!PORTB) skpnz ; { bcf 5,0 ; LED_OFF skpnz ; } else do { incfsz interval ; if (++interval) { goto $+5 ; break; } movfw 6 movwf interval ; interval=PORTB; movlw 1 ; LED_INV xorwf 5 ; } while (0);
sorry, Tippfehler!!! Nehme gerne Macros, und da ist das plain ASM dann nicht mehr so einfach. interval equ 0x20 ; example ram definition test 6 ; if (!PORTB) skpnz ; { bcf 5,0 ; LED_OFF skpz ; } else do { incfsz interval ; if (++interval) { goto $+5 ; break; } movfw 6 movwf interval ; interval=PORTB; movlw 1 ; LED_INV xorwf 5 ; } while (0);
ja danke dir erstmal...ich werdee die woche erstmal programmieren...wenn noch fragen auftauchen sollten, werde ich die hier reinschreiben...mfg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.