Hallo,
ich versuche gerade, mit einem der µC von Atmel ein paar Funktionen für meine RC-Modelle (Schiff) zu realisieren. Für meine ersten (Geh-)Versuche habe ich mir die Beleuchtung eines kleinen Kutters vorgenommen. Da geht es erst einmal nur um 4 Schaltzustände:
Da ich vermutet habe, dass diese Spannungseinbrüche den Controller aus dem Tritt bringen, habe ich noch einen 220 µF-Kondensator in die 5V-Versorgung eingebaut (ist im Schaltplan noch nicht eingezeichnet). Aber auch das brachte nicht die gewünschte Lösung.
Deshalb nun meine Frage an euch: Wie kann ich dem Controller beibringen, ordnungsgemäß wieder am Anfang des Programms zu starten? Meine erste Idee war, den brown-out Detektor zu aktivieren. Wenn ich das richtig verstanden habe, wird dieser mit regelmäßigen Befehlen zurückgesetzt, d.h. das würde mich auch nicht weiterbringen, da das Programm ja noch läuft, allerdings eben fehlerhaft.
Damit ihr wisst, um was es genau geht, füge ich den Schaltplan sowie mein Programm bei und hoffe, dass ihr mir einen Tipp geben könnt, wie ich zu einem stabilen Betrieb kommen kann.
Beste Grüße
Jürgen
Beleuchtung.JPG
Alles anzeigen
ich versuche gerade, mit einem der µC von Atmel ein paar Funktionen für meine RC-Modelle (Schiff) zu realisieren. Für meine ersten (Geh-)Versuche habe ich mir die Beleuchtung eines kleinen Kutters vorgenommen. Da geht es erst einmal nur um 4 Schaltzustände:
- Ankerlicht (wenn Boot vor Anker liegt)
- Decksbeleuchtung (zusätzlich zum Anker-Licht, aber nicht während der Fahrt)
- Positionslichter bei Fahrt
- Suchscheinwerfer (zusätzlich zu Positionslichtern)
Da ich vermutet habe, dass diese Spannungseinbrüche den Controller aus dem Tritt bringen, habe ich noch einen 220 µF-Kondensator in die 5V-Versorgung eingebaut (ist im Schaltplan noch nicht eingezeichnet). Aber auch das brachte nicht die gewünschte Lösung.
Deshalb nun meine Frage an euch: Wie kann ich dem Controller beibringen, ordnungsgemäß wieder am Anfang des Programms zu starten? Meine erste Idee war, den brown-out Detektor zu aktivieren. Wenn ich das richtig verstanden habe, wird dieser mit regelmäßigen Befehlen zurückgesetzt, d.h. das würde mich auch nicht weiterbringen, da das Programm ja noch läuft, allerdings eben fehlerhaft.
Damit ihr wisst, um was es genau geht, füge ich den Schaltplan sowie mein Programm bei und hoffe, dass ihr mir einen Tipp geben könnt, wie ich zu einem stabilen Betrieb kommen kann.
Beste Grüße
Jürgen
Beleuchtung.JPG
Quellcode
- '----- Titel -------------------------------------------------------------------
- ' Module.......: LightControl
- ' Purpose......: Reads RC signal using interrupt 0 on PB2
- ' Switches LED's
- ' 1: Anchor light (Ankerlicht)
- ' 2: Anchor light + deck light (Ankerlicht + Decklicht)
- ' 3: Head light (Fahrlicht)
- ' 4: Head light + search light (Fahrlicht + Suchscheinwerfer)
- ' Measures RC signal in main loop
- ' Needed.......: Either adjust minimum and width of pulse in transmitter settings
- ' or adjust values in constant definitions below
- ' MCU..........: ATTiny 45-20SU
- ' Bascom.......: V2.0.7.9
- '-------------------------------------------------------------------------------
- '----- Settings ----------------------------------------------------------------
- $regfile = "ATtiny45.DAT"
- 'Frequency 1 MHz
- $crystal = 1000000
- $hwstack = 48
- $swstack = 48
- $framesize = 40
- ' 76543210
- DdrB = &B00011011 'PinB0,1,3,4 output, PinB2,5-7 input
- ' 76543210
- Portb = &B11100100 'PullUp PinB2,5-7 active
- '----- Variables ---------------------------------------------------------------
- dim wPulse as word 'stores current reading of RC signal
- dim wPulseLow as word : dim wPulseHigh as word
- dim wActionBias as word 'stores pulse length difference
- dim wSearch as word : dim wSearchLow as word : dim wSearchHigh as word
- dim wHead as word : dim wHeadLow as word : dim wHeadHigh as word
- dim wDeck as word : dim wDeckLow as word : dim wDeckHigh as word
- dim wAnchor as word : dim wAnchorLow as word : dim wAnchorHigh as word
- dim iCount as byte 'used as loop counter
- dim RC_Read as bit 'used to identify rising or falling pulse edge
- Anchor alias portb.0
- Deck alias portb.1
- Head alias portb.3
- Search alias portb.4
- const PulseMin = 125 'minimum pulse length
- const PulseWidth = 113 'pulse width
- const PulseTolerance = 5 'range to define valid switch bias
- const ReadRepeat = 5 'necessary pulse readings before switches change
- wActionBias = PulseWidth / 3 'ActionBias = PulseWidth devided by number of functions to switch
- wSearch = wActionBias * 3
- wSearch = wSearch + PulseMin
- wSearchLow = wSearch - PulseTolerance : wSearchHigh = wSearch + PulseTolerance
- wHead = wActionBias * 2
- wHead = wHead + PulseMin
- wHeadLow = wHead - PulseTolerance : wHeadHigh = wHead + PulseTolerance
- wDeck = wActionBias
- wDeck = wDeck + PulseMin '
- wDeckLow = wDeck - PulseTolerance : wDeckHigh = wDeck + PulseTolerance
- wAnchor = PulseMin
- wAnchorLow = wAnchor - PulseTolerance : wAnchorHigh = wAnchor + PulseTolerance
- '----- Initialization ----------------------------------------------------------
- config timer0 = timer , prescale = 8
- config int0 = change
- on int0 GetPulse
- waitms 2000 'allows pulse reading
- config watchdog = 1024
- wPulse = 0
- RC_Read = 1
- timer0 = 0
- '===== Program =================================================================
- enable timer0
- enable int0
- enable interrupts
- start watchdog
- do
- iCount = 0
- wPulseLow = wPulse - PulseTolerance
- wPulseHigh = wPulse + PulseTolerance
- do 'repeat pulse readings
- if wPulse > wPulseLow and wPulse < wPulseHigh then
- incr iCount
- waitms 25
- wPulseLow = wPulse - PulseTolerance
- wPulseHigh = wPulse + PulseTolerance
- end if
- Loop until iCount = ReadRepeat
- select case wPulse
- case wSearchLow to wSearchHigh
- Search = 1
- Head = 1
- Deck = 0
- Anchor = 0
- case wHeadLow to wHeadHigh
- Search = 0
- Head = 1
- Deck = 0
- Anchor = 0
- case wDeckLow to wDeckHigh
- Search = 0
- Head = 0
- Deck = 1
- Anchor = 1
- case wAnchorLow to wAnchorHigh
- Search = 0
- Head = 0
- Deck = 0
- Anchor = 1
- case else
- Search = 0
- Head = 0
- Deck = 0
- Anchor = 0
- end select
- loop
- end 'end program
- '===== End of program ==========================================================
- '----- Interrupts --------------------------------------------------------------
- GetPulse:
- if RC_Read = 1 then 'start Timer1 if positive signal on input
- start timer0
- RC_Read = 0
- Else 'stop Timer1 if no positive signal
- stop timer0
- wPulse = timer0
- RC_Read = 1
- timer0 = 0
- end if
- reset watchdog
- return
Beste Grüße
Jürgen
Jürgen