www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC16F84 - Blinken soll schneller/langsamer weden


Autor: PIC16F84 - Blinken soll schneller/langsamer weden (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
     }

Autor: PIC16F84 - Blinken soll schneller/langsamer weden (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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);

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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);

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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);

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du es nicht verstehst, schreibe was.

Autor: PIC16F84 - Blinken soll schneller/langsamer weden (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja danke dir erstmal...ich werdee die woche erstmal programmieren...wenn 
noch fragen auftauchen sollten, werde ich die hier reinschreiben...mfg

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.