Hallo,
Ich hoffe ihr könnt einen µC Neuling helfen.
Ich habe mir ein kleines Programm in Bascom geschrieben mit dem ich einen Inverter mit Leuchtfolie ansteuern möchte.
Das Programm hat eigentliche nur 3 Funktionen:
Einmal Leuchtfolie für ca. 10 Sec. an und dann wieder aus.
Wenn man länger auf dem Taster drückt, dauer an. Bei erneutem Taster druck Leuchtfolie wieder aus.
Und die letzte Funktion ist bei Dauer an das die Leuchtfolie nach spätestens 2 Min. von selber wieder ausgeht.
Auf meinem Programierboard (Pollin Atmel Evaluations-Board) funktioniert alles schon Super.
Jetzt habe ich mal alles auf Steckbrett gesteckt. Leider funktioniert es dort nicht mehr so richtig.
Immer wenn ich auf Dauer an gehe (Taster lang gedrückt halten) geht zwar die Leuchtfolie an aber lässt sich nicht mehr ausschalten. Erst nach den Zwei Min Wartezeit geht sie wieder aus.
Auf dem Steckbrett soll die Rote LED die Leuchtfolie darstellen. Bei den zwei Kabeln ist der Taster.
Betrieben wird alles mit 5V und externen 8Mhz Quarz. Als µC verwende ich einen Atmega8.
Habe mal den Code, Schaltplan und ein Bild von meinem Steckbrett angehängt.
'**********AVR-Type Einstellungen:**********
$regfile = "m8def.dat" 'ATmega8
$crystal = 8000000 'Quarz Frequenz 8Mhz
$hwstack = 40
$swstack = 16
$framesize = 32
'**********Config:**********
Config Pind.5 = Output 'Der Pin D.5 (Inverter) wird als Ausgang gestzt
Config Pind.2 = Input 'Der Pin D.2 (Taster) wird als Eingang gesetzt
Config Timer1 = Timer , Prescale = 64 'Configuration des Timers1 (Tasten druck zähler)
Config Timer0 = Timer , Prescale = 1024 'Configuration des Timers0 (Sicherheitszeit zähler)
Enable Timer1 'Schaltet den Timer1 Overflow-interrupt ein
Enable Timer0 'Schaltet den Timer0 Overflow-interrupt ein
On Timer1 Inter_kurze_leuchtdauer 'Verzweige bei Timer1 Overflow zu Inter_kurze_leuchtdauer
On Timer0 Inter_sicherheitszeit 'Verzweige bei Timer0 Overflow zu Inter_sicherheitszeit
Enable Interrupts 'Generell Interrupts einschalten
Timer1 = 35035 'Der Timer1 fängt bei 35035 an zu zählen
Timer0 = 5 'Der Timer0 fängt bei 5 an zu zählen
Stop Timer1 'Stopt den Timer1
Stop Timer0 'Stopt den Timer0
'**********Variablen:**********
Dim X As Byte 'Variable X (Tasten druck) soll bis 256 zählem
Dim S As Word 'Variable S (Sicherheitszeit zähler) soll bis 65535 zählen
'**********Eingänge umbenennen**********
Taster_port Alias Portd.2 'Der Port D.2 wird in "Taster_port" umbenannt
Taster_pin Alias Pind.2 'Der Pin D.2 wird in "Taster_pin" umbenannt
Inverter Alias Portd.5 'Der Pin D.5 wird in "Inverter" umbenannt
'**********Hauptprogramm:**********
Do
Inverter = 0 'Der Inverter wird ausgeschaltet
Taster_port = 0 'Der Taster wird als nicht gedrückt angegeben
If Taster_pin = 0 Then 'Wenn der Taster nicht gedrückt ist dann wird die
X = 0 'Variable X auf Null zurück gesetzt und auch die
S = 0 'Variable S wird auf Null zurück gesetzt
Else
Start Timer1 'sollte der Taster gedückt werden wird der Timer1 aktiviert
End If
If X = 10 Then Gosub Lang 'Sollte die Variable "X" 10 sein dann Sprung in das Untermenü "Lang"
If X = 1 Then Gosub Kurz 'Sollte die Variable "X" 1 sein dann Sprung in das Untermenü "Kurz"
Loop
End
'**********Interrupt´s:**********
Inter_kurze_leuchtdauer:
Timer1 = 35035 'Der Timer1 fängt bei 35035 an zu zählen
Incr X 'Bei jedem Interrupt wird die Variable "X" um eins hochgezählt
Return
Inter_sicherheitszeit:
Timer0 = 5 'Der Timer0 fängt bei 5 an zu zählen
Incr S 'Bei jedem Interrupt wird die Variable "S" um eins hochgezählt
Return
'**********Unterprogramme:**********
Kurz:
If Taster_pin = 1 Then 'Wenn der Taster gedrückt ist dann wird
Start Timer1 'der Timer1 gerstartet und zählt die Variable X weiter hoch
Else 'wenn nicht
Stop Timer1 'wird der Timer1 wieder gestopt und
Inverter = 1 'der Inverter wird eingeschaltet
Wait 10 'Der Inverter ist nun für 10 Sec. eingeschaltet
End If
Return
Lang:
Stop Timer1 'Der Timer1 wird gestopt
Start Timer0 'Der Timer0 wird gestartet und die Variable S wird hochgezählt
Taster_port = 1 'Der Taster wird als gedrückt angegeben
While Taster_pin = 1 'Solange der Taster als gedrückt angegeben ist wird
Inverter = 1 'der Inverter eingeschaltet
If S = 3750 Then Taster_port = 0 'Ist die Variable "S" bei dem Wert 3750 angekommen dann wird der Taster als nicht gedrückt angegeben
Wend
Wait 1 'Warte 1 Sec.
Stop Timer0 'Der Timer0 wird wieder gestopt
Return
Alles anzeigen
Hoffe ihr könnt mir helfen. Komme einfach nicht mehr weiter.
Mit Freundlichen Grüßen
Sascha