PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Softwareroutine



Nexianer
01.03.2011, 09:13
Hallo alle zusammen,

ich möchte ein kleines programm schreiben was als ahuptprogramm nichts weiter macht als auf eine Eingabe warten. Diese Eingabe soll entweder per RS232 oder durch drücken eines Tasters der an einem pin angeschlossen wird erfolgen. Der jeweilige befehl soll dann einfach nur eine weuitere subroutine aufrufen. sollte 1 std. kein befehl gekommen sein soll eine bestimmte routine aufgerufen werden. und dann das selbe nochmal...

wie löse ich das am besten?

PS: ich arbeite mit bascom

hardware.bas
01.03.2011, 16:09
Eine Frage vorweg. Soll der AVR noch andere Funktionen
während des Waertens auf die Eingabe erfüllen? VG Micha

Nexianer
02.03.2011, 10:49
ne eigentlich nicht....
das ganze geht darum den ladezustand von 2 accus zu überwachen die werte per RS 232 Auszugeben und ggf. den einen oder den anderen accu zu laden.

es soll eine manuelle abfrage per rs 232 möglich sein und ein manuelles umschalten auf laden per rs232 und per taster.

sollte diese anfrage nicht kommen so soll 1 mal pro stunde automatisch die spannung geprüft werden und entschieden werden ob geladen werden muss oder nicht....

hardware.bas
02.03.2011, 21:02
Dann wirst Du um Timer- und Interruptprogrammierung nicht
drumrumkommen. VG Micha

Typer
05.03.2011, 14:28
Hi,
wie genau soll die Zeit den sein?

Hier mal ein Beispiel


$regfile = "M168Pdef.dat" 'es handelt sich um einen ATmega168P
$crystal = 3686400 'der eingebauter RC-Oszillator läuft mit 3,6864 Mhz
$hwstack = 100 'im Speicher werden für den Hardware-Stack 100 Byte reserviert
$swstack = 100 'im Speicher werden für den Software-Stack 100 Byte reserviert
$framesize = 100 'im Speicher werden für den Frame 100 Byte reserviert
$baud = 19200


S1 Alias Pind.2 'Schalter 1 an Port D2 (Taster)
Config S1 = Input ' als eingang festlegen
Pind.2 = 1 'Pullup einschalten


'Timer einstellen
'Frequenz-Teiler 1,8,64,256 or 1024
Config Timer1 = Timer , Prescale = 1024
'3686400 / 1024 = 3600 impulse/sek


'Variable festlegen
Dim Sekunde As Byte , Minute As Byte
Sekunde = 0
Minute = 0


'Unterprogramme Declarieren
Declare Sub Prog1 'Unterprog. 1
Declare Sub Prog2 'Unterprog. 2


Do

If S1 = 0 Then 'Wenn S1 gedrückt
Call Prog1 'und Unterprog. 1 Starten
End If


If Timer1 >= 3600 Then
Incr Sekunde 'Sekunden werden gezählt bis 60
Print "Sekunden: " ; Sekunde
Timer1 = 0
End If


If Sekunde >= 60 Then
Incr Minute
Print "Minuten: " ; Minute 'Minuten Zähler, Sekunden auf 0 setzen
Sekunde = 0
End If


If Minute >= 60 Then 'Bei 60 Minuten, Unterprog 2 starten und Minuten auf = setzen
Minute = 0
Call Prog2
End If

Loop



End



Sub Prog1 'Unterprog. 1

Bitwait S1 , Set 'warten bis Taster S1 losgelassen wird

Print
Print "Taster S1 wurde gedrueckt"
Print

Sekunde = 0 'Zeit auf 0 setzen
Minute = 0

End Sub



Sub Prog2 'Unterprog. 2

Print
Print "Prog2 gestartet"
Print

Sekunde = 0 'Zeit auf 0 setzen
Minute = 0

End Sub
Timer 1 läuft und zählt sekunden hoch, diese zählen minuten hoch bis Taster 1 gedrückt wird oder 60 Minuten gezählt sind.

Bei Taster startet Prog1 und Zeit wird wieder auf 0 gestellt
Bei 60 min startet Prog2 und Zeit wird wieder auf 0 gestellt

ACHTUNG: Quarz richtig einstellen!!! und Timer anpassen falls andere Quarz verwendet wird

hardware.bas
05.03.2011, 15:05
Sehr gut: Quarzstabilisiert mit Baudratenquarz.
Mit dieser Hardware dürfte nix schiefgehen. VG Micha