Forum:	Relaiskarten
Téma:	lowcost io-karte mit atmel atmega kontroller
----------------------------------------------------

fuchs:
hi,
inspiriert durch shadowrun's thread
http://www.car-pc.info/phpBB2/viewtopic.php?t=3948&amp;highlight=
hab ich mich mal mit den atmel mikrokontrollern vom typ ATMEGAxx beschäftigt.
datenblatt: 
http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf

mit den kontrollern kann man wirklich sehr günstig io-karten aufbauen.
hier ein erster prototyp (danke frank!)

diese schaltung hat 
- nicht weniger als 32 ein-/ausgänge, 
- davon 8 analoge eingänge
- treiber für 16 relais (500mA) (die beiden kleinen käfer)
- drehzahleingänge
- 16mhz prozessor mit internem oszillator
- 32k flash rom
- rs232 schnittstelle zur verbindung zum PC
- Bauteilkosten unter 10,- Euro!
updates können ohne ausbau des chips geflasht werden (links auf dem bild ist das programmiergerät zu sehen, ein ähnliches läßt sich für 5,- euro selbstbauen)
link: http://rumil.de/hardware/avrisp.html
der kontroller ist in assembler programmierbar, es gibt aber auch compiler für c und für basic als freeware.
ich denke, das ist eine interessante hardwareplattform für unsere anwendungen im auto und könnte die grundlage für ein cpi- gemeinschaftsprojekt werden, wenn sich noch andere dafür interessieren.
gruß und einen guten rutsch,
olaf

kevin_lebt:
Hi erstmal ein gutes Neues Jahr2. RESPECT!
Hab mir das USB Experiment Interface K8055 von Conrad besorgt.
Bin eigentlich ganz zufrieden nur eins stört mich es hat nur 2 Analoge Eingänge.
Bin an deinem Projektinterresiert!
Mfg Flo

Vik:
Habe auch vor soetwas zu bauen. Finde diese Lösung auf jeden Fall besser als die teure CES Relaiskarte. Was hast du als Treiber für die Relais genommen? Sind das uln2803a?

fuchs:
@kevin_lebt:
schönes neues jahr und willkommen im forum!
das k8055 hab ich auch, bin eigentlich sehr zufrieden mit dem teil, aber es könnte halt mehr eingänge haben.
Mit dem ATMEGA32 hat man imerhin 8 analoge eingänge und falls das nicht ausreicht, kann man noch einen multiplexer vorschalten und damit die anzahl nahezu beliebig vergrößern.
@vik:
ja genau, das sind die uln2803a. hab ich mir vom K8055 abgeguckt. 
da werden sie sowohl als ausgangs- alsauch als eingangsstufen verwendet.
die kosten nur 40cent und haben 8 Treiber mit integrierten freilaufdioden für induktive lasten.
der ATMEGA32 , den ich verwende, kostet 6,20 euro, der ATMEGA16 mit 16k flash kostet 4,15 euro.
hast du deine AVRs mit assembler oder in c programmiert?

Vik:
fuchs hat folgendes geschrieben:...hast du deine AVRs mit assembler oder in c programmiert?
In Basic (bitte nich hauen ;-)) konnte ich halt schon und war mir der einfachste weg wobei ich denke dass ich mir endlich mal c(++) aneignen müsste...^^ 
von den uln2803a hab ich auch noch einige zuhause zumfliegen. werde mal wenn ich wieder genug zeit hab meinen isp reparieren und mir ein paar ATmega bestellen...hatte vorher nur mit dem AT90S2313 "rumgespielt"...
ich denke mal dass ich mein "gerät" noch mit einem usb-2-rs232 ic ausstatten werde da meine serielle schnittstelle beim carpc schon für obd vorgesehen ist ^^

Mic:
So, frohes Neues erst einmal. :explosivesmile: Ich hoffe ihr seid alle gut reingekommen.
Hallo Fuchs und vik,
endlich mal Leute die Ahnung haben. :notworthy: 
Bin begeistert von eurer Idee.
Ich hatte mir an anderer Stelle schon einmal Gedanken um der wünschenswerten Funktionen einer Ein-Ausgangs Relaiskarte gemacht. :scratch: 
Man könnte ja einige wichtige Funktionen integrieren.
Der absolute Hit wäre es, wenn man das Ganze über C.E.S. bedienen könnte. Furious hat ja angekündigt sich darum zu kümmern. :dancing: 
Relaiskarte Wunschfunktionen:
PC Startfunktion:
- Relaiskontakt Schließer für 0,5-5 Sec - PC Ein (Zeit über Poti einstellbar)(Wird parallel zum Eintaster PC angeschlossen)
- Relaiskontakt Schließer für 0,5-5 Sec - TFT Ein (Zeit über Poti einstellbar) (Wird parallel zum Eintaster TFT angeschlossen)
PC Shutdownfunktion:
- PC sollte geregelt herunterfahren (Shutdown, Hibernate oder wie auch immer) (Zeit über Poti einstellbar 0Sec-15Min)
(realisiert über Einschaltimpuls PC(=Ausschaltimpuls)
Bei
- Kontakt Eingang Zündung +
Funktion: Sollte bei Kontakt ZV aufPC Startfunktion ausführen.
- Kontakt Eingang Zentralverriegelungsimpuls AUF (sowohl + gesteuert als auch – gesteuert)
Funktion: Sollte bei Kontakt ZV aufPC Startfunktion ausführen.
- Kontakt Eingang Zentralverriegelungsimpuls ZU(sowohl + gesteuert als auch – gesteuert)
Funktion: Sollte bei Kontakt ZV zuPC Shutdownfunktion.
- Kontakt Eingang Zusatzkontakt Alarmanlage (per Funk) (sowohl + als auch –) Sollte bei Betätigen der Fernbedienung PC Startfunktion ausführen,
so kann man per Alarmanlagenzusatzkontakt den PC auch ohne Zündung starten (W-Lan Datenabgleich).
Wenn man erneut die Taste der KFZ Alarmanlage drückt (wenn keine Spannung am Eingang der Relaiskarte anliegt =&gt; Shutdownfunktion
- Kontakt Eingang Licht +
Funktion: Gain-steuerung (TFT hell-dunkel)
- Temperatursensoren, Drehzahl, Tachosignal usw. usw.
Mit den oben beschriebenen Funktionen wird für einige Leute (die das ITPS nur zur Start oder Shutdownfunktion nutzen) ein ITPS überflüssig.
Das mit dem usb-2-rs232 ic finde ich auch eine geniale Idee, hat den Vorteil, das die Ser. Schnittstelle frei bleibt und man kann die Karte überall verbauen ohne doppelt Kabel ziehen muss. (USB-Hub)
Versteht meine Anregungen nicht falsch, ich will ja niemanden unter Druck setzen. Ist nur eine Traumkonfiguration von mir. :x-mas: 
Gruß aus Bo
Mic

fuchs:
@vik: ich hab zwei freie com-ports, deswegen brauche ich nicht unbedingt usb.
aber ansonsten gäbe es ja den FT232BM (6,xx euro) , mit dem man gleich onboard eine usb wandlung machen könnte.
@ mic: kein problem, ist morgen fertig ;-)

Mic:
@fuchs: Bin jajetzt absolut begeistert.
Dann wird ja übermorgen das Layout fertig sein und ich kann die Platinen bei uns in der Fa ätzen lassen.
Am Donnerstag könnte die Serie bestückt werden und wenn die Post mitspielt haben wir zum Wochenende alle unsere Relaiskarten. Hut ab.
Spaß bei Seite, bei der Entwicklung eines solchen Projektes sollte man ja im Vorfeld die Anforderungen klären, um nicht später zu merken, das etwas unterdimensioniert ist.
Was hältst du von der Idee Alarmanlagen bzw ZV-Kontakte in die Karte miteinzubeziehen ?
Schaltung Realisierbar ???
Gruß
Mic

fuchs:
@vik:
warum nicht in basic programmieren, wenn man damit am schnellsten zum ergebnis kommt.
damit bist Du mir auf jeden fall einen schritt voraus, da ich mich zum ersten mal an die programmierung eines avr's herantraue.
für mich ist C aus folgenden gründen der favorit für hardwarenahe programmierung:
- es ist schneller als basic (hab gelesen, dass die avr's sogar für c-programmierung optimiert sind)
- es ist übersichtlicher als assembler
assembler ist für kleinere projekte sicher die bessere wahl, weil es weniger speicher braucht und schneller ist.
da man beim ATMEGA32 ja recht viel speicher hat und die funktionen evtl. ziemlich komplex werden, würde ich C vorziehen.
falls man mit mehreren leuten an einem projekt arbeitet, ist der quellcode in C auch leichter zu verstehen als in assembler.
hier noch ein link zur usb-umsetzung:
http://home.t-online.de/home/holger.klabunde/usb/usb.htm#FT232Board
auf der gleichen seite gibts auch noch weitere doku und beispiele zum avr:
http://home.t-online.de/home/holger.klabunde/avr/avrboard.htm
hier noch eine einführung in die programmierung eines avr's in c:
http://www.mikrocontroller.net/wiki/AVR-GCC-Tutorial
@mic:
im prinzip müßten alle funktionen, die du angesprochen hast, realisierbar sein. 
die software im avr läuft ja unabhängig vom car-pc. deshalb könnte man den pc damit auch zeitgesteuert ein und ausschalten. das ist alles nur eine frage der programmierung bzw. ob man dafür genug ein- und ausgänge frei hat.
alles ist möglich, allerdings muß man in das projekt noch viel arbeit reinstecken, bevor man was funktionfähiges in händen hält.
das ist eher was für leute, die gerne selber entwickeln und spass daran haben,mit elektronik bzw. software rumzuprobieren.
wer "plug and play" sucht, ist mit der rs-karte von furious oder der K8055 von elv/conrad auf jeden fall besser bedient.

Vik:
C ist meiner Meinung auch die beste Lösung jedoch ist assembler meist schneller und deshalb interessant für zeitrelevante anwendungen. 
Zum thema beschränkte ein und ausgänge muss ich sagen dass man über den I²C bus das ganze gut erweitern kann. ausserdem gibt es dafür einen praktischen temperatursensor (ich glaub das war der LM75 von national semiconductor.)

Shadowrun:
Also ich habe jetzt übers Wochenende mir assembler angeeignet.
(Basic und C haben keine richtigen umgebungen oder sind beschrängt in der Programmiergröße,
Im AVR Studio kann ich "sehen" wie was abgearbeitet wird.)
Mein Testboard hat 8 LEDs dran ein 4x20 Zeilen LCD und 5 Taster.
Habe jetzt mal 5 Lauflchter Prgrammiert dau wird passend im LCD angezeigt welches gerade läuft. (Sind insgesamt 520 Byte)
Das schwierige ist aber immer: Es gibt keine Pseudoparallelverarbeitung.
Die LEDs werden ja nacheinander geschaltet. dazwischen lasse ich den Kontroller nen paar tausend mal nichtstun aber während dieses nichtstun muß er ja doch noch die Eingänge überwachen etc.
Hier mal mein Code:
Code:
.include &quot;m16def.inc&quot;&nbsp; &nbsp; &nbsp; &nbsp;;bzw. 2333def.inc

.def temp1 = r21
.def temp2 = r22
.def temp3 = r23
;#############################################################################
;############ Stack initialisieren um Unterprogramme aufzurufen ##############
;#############################################################################
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi r16, LOW&#40;RAMEND&#41;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; LOW-Byte der obersten RAM-Adresse
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out SPL, r16
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi r16, HIGH&#40;RAMEND&#41;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; HIGH-Byte der obersten RAM-Adresse
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out SPH, r16
;#############################################################################
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
;#############################################################################
;###########&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Startwerte setzen&nbsp; &nbsp;&nbsp; &nbsp;##############
;#############################################################################
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi r16, 0xFF
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out DDRB, r16&nbsp; &nbsp; &nbsp; &nbsp;;Port B durch Ausgabe von 0xFF ins
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;Richtungsregister DDRB als Ausgang konfigurieren
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi r16, 0xFF
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out DDRC, r16&nbsp; &nbsp; &nbsp; &nbsp;;Port C durch Ausgabe von 0xFF ins
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;Richtungsregister DDRB als Ausgang konfigurieren
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi r16, 0x00
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out DDRD, r16&nbsp; &nbsp; &nbsp; &nbsp;;Port D durch Ausgabe von 0x00 ins
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;Richtungsregister DDRD als Eingang konfigurieren
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi r16, 0xFF
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out PORTB, r16&nbsp; &nbsp; &nbsp; ;PORTB auf 0xFF setzen -&gt; alle LEDs aus
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_init&nbsp; &nbsp; &nbsp; ;Display initialisieren
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_clear&nbsp; &nbsp; &nbsp;;Display löschen
&nbsp; &nbsp;
&nbsp; &nbsp; rcall setze1&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;; Taste 1 wurde gerückt zum Start des Prgoramms
;#############################################################################&nbsp; &nbsp; 
&nbsp; &nbsp; 
&nbsp; &nbsp; 
;#############################################################################
;###########&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Hauptprogramm&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;##############
;#############################################################################
main&#58;
&nbsp; &nbsp;sbrs r20,1&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ; Ist im Arbeitsregister 20 das 2 Bit null so wurde Taste 1 gedrückt und lauflicht 1 wird ausgeführt
&nbsp; &nbsp;rcall lauflicht1
&nbsp; &nbsp;sbrs r20,2
&nbsp; &nbsp;rcall lauflicht2
&nbsp; &nbsp;sbrs r20,3
&nbsp; &nbsp;rcall lauflicht3
&nbsp; &nbsp;sbrs r20,4
&nbsp; &nbsp;rcall lauflicht4
&nbsp; &nbsp;
&nbsp; &nbsp;sbrs r20,5
&nbsp; &nbsp; &nbsp; &nbsp; rcall lauflicht5
rjmp main
;#############################################################################

;#############################################################################
;###########&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Hauptprogramm&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;##############
;#############################################################################&nbsp; &nbsp;
lese&#58;
&nbsp; &nbsp;sbis PIND,2&nbsp; &nbsp; &nbsp; ; Ist im Inputregister das 2 Bit null so wird Taste 1 gedrückt und setzte 1 wird ausgeführt
&nbsp; &nbsp;rcall setze1 
&nbsp; &nbsp;
&nbsp; &nbsp;sbis PIND,3
&nbsp; &nbsp;rcall setze2&nbsp; 
&nbsp; &nbsp;
&nbsp; &nbsp;sbis PIND,4
&nbsp; &nbsp;rcall setze3 
&nbsp; &nbsp;
&nbsp; &nbsp;sbis PIND,5
&nbsp; &nbsp;rcall setze4 
&nbsp; &nbsp;
&nbsp; &nbsp;sbis PIND,6
&nbsp; &nbsp;rcall setze5&nbsp; 
ret
;#############################################################################

;#############################################################################
;###########&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Hauptprogramm&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;##############
;#############################################################################
setze1&#58;
&nbsp; &nbsp;ldi r20, 0b11111101 ;Arbeitsregister 20 wird auf 11111101 gesetzt
&nbsp; &nbsp;rcall schreibe&nbsp; &nbsp; &nbsp; ; schreibe wird ausgeführt
&nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; ldi temp1, '1'&nbsp; &nbsp; &nbsp; ;Zeichen '1' ans Dislpay senden 
&nbsp; &nbsp; &nbsp; &nbsp; rcall lcd_data&nbsp; &nbsp; &nbsp; ;&nbsp; &nbsp; &nbsp; &nbsp; &quot;
ret
;#############################################################################

;#############################################################################
;###########&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Hauptprogramm&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;##############
;#############################################################################
setze2&#58;
&nbsp; &nbsp;ldi r20, 0b11111011
&nbsp; &nbsp;rcall schreibe
&nbsp; &nbsp; &nbsp; &nbsp; ldi temp1, '2'&nbsp; &nbsp; &nbsp;;Zeichen anzeigen
&nbsp; &nbsp; &nbsp; &nbsp; rcall lcd_data
ret
;#############################################################################

;#############################################################################
;###########&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Hauptprogramm&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;##############
;#############################################################################
setze3&#58;
&nbsp; &nbsp;ldi r20, 0b11110111
&nbsp; &nbsp;rcall schreibe
&nbsp; &nbsp; &nbsp; &nbsp; ldi temp1, '3'&nbsp; &nbsp; &nbsp;;Zeichen anzeigen
&nbsp; &nbsp; &nbsp; &nbsp; rcall lcd_data
ret
;#############################################################################

;#############################################################################
;###########&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Hauptprogramm&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;##############
;#############################################################################
setze4&#58;
&nbsp; &nbsp;ldi r20, 0b11101111
&nbsp; &nbsp;rcall schreibe
&nbsp; &nbsp; &nbsp; &nbsp; ldi temp1, '4'&nbsp; &nbsp; &nbsp;;Zeichen anzeigen
&nbsp; &nbsp; &nbsp; &nbsp; rcall lcd_data
ret
;#############################################################################

;#############################################################################
;###########&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Hauptprogramm&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;##############
;#############################################################################
setze5&#58;
&nbsp; &nbsp;ldi r20, 0b11011111
&nbsp; &nbsp;rcall schreibe
&nbsp; &nbsp; &nbsp; &nbsp; ldi temp1, '5'&nbsp; &nbsp; &nbsp;;Zeichen anzeigen
&nbsp; &nbsp; &nbsp; &nbsp; rcall lcd_data
ret
;#############################################################################

;#############################################################################
;###########&nbsp; &nbsp;Proceduer Schreibe&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;##############
;#############################################################################
schreibe&#58;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_clear&nbsp; &nbsp; ;Display löschen&nbsp; &nbsp;&nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 'L'&nbsp; &nbsp; &nbsp;;Schreibt 'Lauftlicht Nr ' ins Display
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 'a'&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 'u'&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 'f'&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 'l'&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 'i'&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 'c'&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 'h'&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data&nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 't'&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data&nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, ' '&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 'N'&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 'r'&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, ' '&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_data&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
ret
;#############################################################################

;#############################################################################
;###########&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Procedure Warte&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;##############
;#############################################################################
warte&#58;
; delaying 199998 cycles&#58;&nbsp; &nbsp; &nbsp; ;Es werden 199998 Dürchgänge nix getan
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ldi&nbsp; R17, $06
WGLOOP0&#58;&nbsp; ldi&nbsp; R18, $37
WGLOOP1&#58;&nbsp; ldi&nbsp; R19, $C9
WGLOOP2&#58;&nbsp; dec&nbsp; R19
&nbsp; &nbsp;&nbsp; rcall lese &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Aber dazwischen wird bei jedem Schritt noch mal der Inputport gelesen
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; brne WGLOOP2
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dec&nbsp; R18
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; brne WGLOOP1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dec&nbsp; R17
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; brne WGLOOP0
; ----------------------------- 
ret

;#############################################################################
;###########&nbsp; Die verscheidenen Lauflichter und LCD Proceduren&nbsp; ##############
;#############################################################################
lauflicht1&#58;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b00111111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11001111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11110011
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11111100
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11111111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
ret
lauflicht2&#58;
&nbsp; &nbsp;ldi r16,0b11111110
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11111011
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11101111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b10111111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b01111111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11011111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11110111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11111101
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
ret
lauflicht3&#58;
&nbsp; &nbsp;ldi r16,0b11111100
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11110000
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11000000
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b00000000
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b00000011
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b00001111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b00111111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11111111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
ret
lauflicht4&#58;
&nbsp; &nbsp;ldi r16,0b11111010
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11101011
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b10101111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b00111111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b01011111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11010111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11110101
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11111100
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
ret
lauflicht5&#58;
&nbsp; &nbsp;ldi r16,0b11111111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b00111111
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b00111100
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b00001100
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b00000000
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11000000
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11000011
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
&nbsp; &nbsp;ldi r16,0b11110011
&nbsp; &nbsp;out PORTB, r16
&nbsp; &nbsp;rcall warte
&nbsp; &nbsp;
ret

&nbsp;;sendet ein Datenbyte an das LCD
lcd_data&#58;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mov temp2, temp1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;&quot;Sicherungskopie&quot; für
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;die Übertragung des 2.Nibbles
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;swap temp1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;Vertauschen
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;andi temp1, 0b00001111&nbsp; &nbsp; &nbsp; &nbsp;;oberes Nibble auf Null setzen
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sbr temp1, 1&lt;&lt;4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;entspricht 0b00010000
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out PORTC, temp1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;ausgeben
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_enable&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;Enable-Routine aufrufen
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;2. Nibble, kein swap da es schon
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;an der richtigen stelle ist
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;andi temp2, 0b00001111&nbsp; &nbsp; &nbsp; &nbsp;;obere Hälfte auf Null setzen 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sbr temp2, 1&lt;&lt;4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;entspricht 0b00010000
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out PORTC, temp2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;ausgeben
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_enable&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;Enable-Routine aufrufen
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall delay50us&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;Delay-Routine aufrufen
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ret&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;zurück zum Hauptprogramm
&nbsp;;sendet einen Befehl an das LCD
lcd_command&#58;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;wie lcd_data, nur ohne RS zu setzen
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mov temp2, temp1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;swap temp1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;andi temp1, 0b00001111
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out PORTC, temp1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_enable
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;andi temp2, 0b00001111
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out PORTC, temp2
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_enable
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall delay50us
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ret
&nbsp;;erzeugt den Enable-Puls
lcd_enable&#58;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sbi PORTC, 5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;Enable high
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nop&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;3 Taktzyklen warten
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nop
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nop
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cbi PORTC, 5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;Enable wieder low
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ret&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;Und wieder zurück&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;;Pause nach jeder Übertragung
delay50us&#58;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;50us Pause
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ldi&nbsp; temp1, $02
EGLOOP0&#58;&nbsp; ldi&nbsp; temp2, $84
EGLOOP1&#58;&nbsp; dec&nbsp; temp2
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; brne EGLOOP1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dec&nbsp; temp1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; brne EGLOOP0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;wieder zurück
&nbsp;;Längere Pause für manche Befehle
delay5ms&#58;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;5ms Pause
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ldi&nbsp; temp1, $86
PGLOOP0&#58;&nbsp; ldi&nbsp; temp2, $C6
PGLOOP1&#58;&nbsp; dec&nbsp; temp2
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; brne PGLOOP1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dec&nbsp; temp1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; brne PGLOOP0
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ret&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;wieder zurück
&nbsp;;Initialisierung&#58; muss ganz am Anfang des Programms aufgerufen werden
lcd_init&#58;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi&nbsp; &nbsp;temp3,50
powerupwait&#58;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall&nbsp; &nbsp;delay5ms
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dec&nbsp; &nbsp;temp3
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;brne&nbsp; &nbsp;powerupwait
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 0b00000011&nbsp; &nbsp; &nbsp; &nbsp; ;muss 3mal hintereinander gesendet
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out PORTC, temp1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;werden zur Initialisierung
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_enable&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall delay5ms
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_enable&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;2
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall delay5ms
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_enable&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;und 3!
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall delay5ms
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 0b00000010&nbsp; &nbsp; &nbsp; &nbsp; ;4bit-Modus einstellen
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;out PORTC, temp1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_enable
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall delay5ms
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 0b00101000&nbsp; &nbsp; &nbsp; &nbsp; ;noch was einstellen...
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_command
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 0b00001100&nbsp; &nbsp; &nbsp; &nbsp; ;...nochwas...
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_command
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 0b00000100&nbsp; &nbsp; &nbsp; &nbsp; ;endlich fertig
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_command
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ret
&nbsp;;Sendet den Befehl zur Löschung des Displays
lcd_clear&#58;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ldi temp1, 0b00000001&nbsp; &nbsp;;Display löschen
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall lcd_command
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcall delay5ms
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ret

Denke aber nen ITPS und ne Relaiskarte wird nicht so schwierig.
Heute werde ich noch mal versuchen das UART anzubauen. Dann noch ein vernünftiges Protokoll schreiben um mit dem Chip zu kommunizieren und Werte zu ändern (wenn schon dann ein Programmierbares ITPS so dass jeder seine Wunschzeiten eintagen kann ohne neu zu flashen)

compucat:
@shadowrun
nicht schlecht, Herr Specht, so was nach einem Tag Assembler-Training.
Dann werden wir hier hoffentlich bald die PWM / ADC Ladesteuerung für die Back-Up-Batterie und die damit verbundene Steuerung von MOSFET's anstelle der Klapper-Relais sehen.
Übrigens, der Butterfly-AVR als Eingabe-Steuergerät am Armaturenbrett wäre auch was feines.
Gruß compucat

fuchs:
@shadowrun:
das sieht ja schon gut aus. danke, dass Du deinen quellcode veröffentlich hast.
über die "pseudo-parallel-verarbeitung" hab ich mir auch schon gedanken gemacht.
eine idee wäre, eine zeitscheibe zu verwenden. 
d.h. es läuft eine art task-scheduler ab, der nacheinander verschiedene programmteile aufruft.
das einfachste wäre, einen zähler zu nehmen und mit einer UND-maske die bits auszucodieren, z.b. so:
Code:
counter=0;
&nbsp; &nbsp; &nbsp; /*Funktionsaufrufe VOR den Zeitscheibenfunktionen*/
&nbsp; &nbsp; &nbsp; startfunktion&#40;&#41;;
while &#40;1&#41; /* schleife unendlich wiederholen */
&nbsp; &nbsp; &nbsp; counter++; /* Es wird die naechste Zeitscheibe &quot;adressiert&quot; */
&nbsp; &nbsp; &nbsp; if &#40;counter &amp; 0x01&#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/*Funktionen alle 5 ms*/
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;funktion_5ms_1&#40;&#41;;&nbsp; /*Zeitkritische funktion 1*&quot;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;funktion_5ms_2&#40;&#41;;&nbsp; /*Zeitkritische funktion 2*&quot;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;usw...
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if &#40;counter &amp; 0x02&#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*Funktionen alle 10 ms*/
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;funktion_10ms_1&#40;&#41;;&nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;funktion_10ms_2&#40;&#41;;&nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;usw....
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &#40;counter &amp; 0x04&#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/*Funktionen alle 20 ms*/
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;funktion_20ms_1&#40;&#41;;&nbsp; /*Zeitunkritische Funktion 1*/
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;funktion_20ms_2&#40;&#41;;&nbsp; /*Zeitunkritische Funktion 2*/
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if &#40;&#40;counter &amp; 0x08&#41; != 0&#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*Zähler zurücksetzen*/
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter = 0;



compucat:
@fuchs
Zumindest beim ATm16 liefern alle Blöcke, die für Car-PC Anwendungen zeitkritisch sein könnten (ADC und PWM für Spannungsregelung, Zeitgeber) jeweils Interrupts.Die müsste man doch ausnutzen können, um zeitkritischen Anwendungen Vorrang zu geben. 
Bei zeitunkritischen Anwendungen (Warten auf Eingaben, Bedingungen) könnte man beim Aufruf einen der Timer starten, der dann bei Zeitablauf (nach relativ kurzer Zeit) über Interrupt einen Rücksprung erzwingt.
Wenn das nicht hinzukriegen ist, dürfte ein round robin task scheduler, wie von Dir vorgeschlagen, zumindest ein gangbarer Weg sein, vor allem, wenn zeikritische Anwendungen melden, ob sie überhaupt Rechenbedarf haben..
Gruß
compucat

fuchs:
Zitat von shadowrum:
"(Basic und C haben keine richtigen umgebungen oder sind beschrängt in der Programmiergröße,
Im AVR Studio kann ich "sehen" wie was abgearbeitet wird.)"
na, das stimmt aber nicht so ganz, ich hab mir jetzt eine schöne (und vor allem kostenlose) entwicklungsumgebung für die programmierung in C eingerichtet:
Als compiler verwende ich "WinAvr":
die all-in-one-lösung enthält auch eine programmieroberfläche mit projektverwaltung und die möglichkeit, das fertige programm in den avr zu flashen.
Zum Simulieren nutze ich das AVRStudio von Atmel. Das kann nämlich nicht nur Assembler- sondern auch C-programme simulieren/debuggen.

wie man das alles schritt für schritt einrichtet, kann man hier nachlesen:
http://www.kreatives-chaos.com/index.php?seite=avrgcc
also, ich finde C ist echt ideal für so eine anwendung. 
...und falls man doch mal eine ganz zeitkritische funktion hat, kann man sie ja in assembler schreiben und in den C-Quelltext einfügen.
(bitte nicht falsch verstehen, das ist nur meine meinung, will hier keinem was vorschreiben:wink: )

Shadowrun:
Ja ist mir schon klar.
Insgesamt habe ich mir jetzt zum Ziel gemacht:
Relaiskarte mit 16 Variablen ein und ausgängen. Hardwaremäßig wurde ich das so wie bei meinem Testboard machen: Die Pins einfach per Steckbrücke rausführen und dann wird je nach Wunsch das Relaisboard Huckepack draufgesteckt. So kann man auch noch ein LCDAnschluß Huckepack draufstecken.
Dann soll das ganze noch PC an/ aus funktion haben halt ca wie das ITPS nur konfigurierbar
Für die Software habe ich mir auch schon gedanken gemacht:
Der PC ist iimmer die initialisiernde Kraft. So kann der Kontroller immer in einer Dauerschleife schauen ob sich an den Pins was verändert hat.
Wenn was sih verändert hat schickt er denneuen Status blind an den PC.
Wenn nu der PC was schickt da gibts ja
ReceiveByte und dafür ist ja ein Interrupt und da kann dann ja rein:
Hat er vom PC ein "S" (für Status) bekommen:
Dann schickt er den Status aller Anschlüsse zum PC
Bekommt er ein C (für Command):
Dann bekommt er nachfolgend die neu zu steztenden Relais bzw LCD Befehle
Bekommt er ein "I" ( für ITPS) :
sendet er wies im Moment mit der ITPS Funktion aussieht.
Bekommt er ein "J" ( kommt halt im Alphabet nach I):
Nimmt er zB neue Zeiten für die ITPS Funktion und neue Ports entgegen (Wenn jemand etwas anders verkabelt hat)

fuchs:
so in der art stell ich mir das auch vor.
zu den eingängen:
was hältst du bzw. Ihr davon , einen 16 zu 1 multiplexer für die analogen eingänge einzusetzen?
damit könnte man die anzahl der analogen eingänge auf 16 erhöhen, so daß die konfiguration dann so aussehen könnte:
16 Analoge Eingänge (auch als Digitale Eingänge nutzbar)
11 Digitale Eingänge (davon 3 Drehzahleingänge)
16 Ausgänge (Digital oder PWM)
edit: nur 9 Digitale Eingänge, weil 2 für die RS232-Schnittstelle drauf gehen

Shadowrun:
klingt gut aber ich glaube da schießt man übers Ziel hinaus.
Ich denke mal die vorhanden anschlüsse reichen vollkommen aus.
Habe meine Karte jetzt auf 
8 digitale ausgänge
8 digitale Eingänge.
anschluß per COM 
Ansteuerung eines LCDs 
und 8 analoge eingänge umgebaut.
2 analoge eingänge werden von meiner Lenkradfernbedienung eingenommen
2 digitale für den anschluß an den ps2 Port (für die Lenkradfernbedinung)
2 digitale Für Zündung und Licht.
Frei ist da also noch ne Menge.
Ich würde ja gerne mal mein Testboard nen Bild posten aber leider ist mein Handy alle und ich finde das Ladegerät nicht grrrrrrrrrr.
Habe da aber immer die 8 Pins (PA0-PA8, PD......) zur Seite gelegt und dann noch Ground und +5V.Da setze ich dann meine LED Platine oder die Tasterplatine oder die Platine mit dem LCD drauf. 
So kann man da ja auch nen Multiplexer draufknallen nen Relaistreiber und nach und nach erweitern.
Da werden wir schneller Ergebnisse produzieren als wir uns ne MegaVersion bauen die dann zu lange braucht bis sie fertig ist.
Ich werde jetzt übers Wochenende versuchen obiges vorgeschlagenes Programm in Assembler zu schreiben. Dazu dann noch ne ITPS Funktionund eine Funktion meine Lenkradfernbedieunganzuschließen und zwar über den PS2 Tastatur Anschluß.
Wenn das läuft kann man ja seine Port wenn man denn mehr braucht erweitern

Mic:
Euer Tempo ist bemerkenswert. Weiter so.
Gruß
Mic

G-Punkt:
Also ich finds sehr spannend wie ihr hier am arbeiten seid !
Man merkt das dieses Forum wirklich dazu genutzt wird zusammen Lösungen für wirklich interessante Probleme zu finden.
Mich würde persöhnlich interessieren, ob es mit einer solchen Relaiskarte auch möglich wäre eine art "analoger" Ausgänge zur Verfügung zu stellen. Ich stelle mir das nach dem prinzip vor eine Ausgangsspannung an einem Ausgang von 0-12 V Regelbar zur verfügung zu stellen (so eine art Software gesteuertes Poti).
Wäre für mich persöhnlich sehr interessant da sich dadurch z.B. eine Selbstgebaute Sitzheizung oder ähnliches komfortabel vom Car-PC steuern lassen würden. Vieleicht hab ich damit ja auch andere inspiriert jetzt *g*.

mfg G-Punkt

Shadowrun:
Na ja man könnte über einen digitalen ausgang einen Kondensator aufladen der über einen großen widerstand entladen wird.
Macht man jetzt den Digitalen eingang von an so hat man 5 V Schaltet man ihn 8000000 Mal in der Sekunde an und gleich wieder aus ist die Spannung niedriger aber durch den Kondensator geglättet so dass man einen Ausgang 0-5 V Hätte. Damit einen Transistor über einen Spannungsteiler steuern und fertig. Ist also eigentlich eine kleine Schaltung.
Heute werde ich wenn ich alle Teile bekomme meinen Relaiskarten Prototyp ätzen. Wenn der Fertig ist kann ich ja versuchen obiges anzubauen.

fuchs:
Hi,
die letzten tage hab ich kaum was an der io-karte gemacht.
ich hab ein bischen mit der rs232-übertragung experimentiert und angefangen mein programm IO-control (für das k8055 board) auf den AVR umzuschreiben.
http://www.car-pc.info/phpBB2/viewtopic.php?t=3154&amp;highlight=k8055
@g-punkt:
für deine anwendung hat der atmega schon sog. PWM-Ausgänge vorgesehen. für die programmierung braucht man nur noch einen prozentwert vorzugeben, die einstellung des impuls-pausen-verhältnisses macht der avr selbst. 
siehe auch:
http://www.mc-project.de/Pages/AVR/PWM/pwm.html
@shadowrun:
auf dem K8055-board ist eine PWM-Analog-Wandler schaltung drauf, wenn du willst, schick ich dir den schaltplan.
Hast Du eigentlich schon ein Protokoll für die RS232-Übertragung?
wär ja vorteilhaft, wenn wir bei der übertragung das gleiche protokoll benutzen, um kompatibel zu bleiben.
ein kleiner nachteil ist, daß der atmega keinen vernünftigen eingangspuffer hat. 
ich habs jetzt so gemacht, daß ich mir in einer interrupt-funktion einen selbstdefinierten puffer vollschreibe. dafür ist in jeder nachricht im ersten byte die länge hinterlegt.
klappt ganz gut so.
hast du eine günstige möglichkeit, platinen zu ätzen?
cu

Mic:
@Fuchs
zu hast du eine günstige möglichkeit, platinen zu ätzen? 
Ich könnte das mal auf der Arbeit antesten. (wenn die Lehrwerkstatt noch Kapazitäten frei hat. Ich denke schon. Die Jungs wollen ja was lernen.)

Shadowrun:
Ich ätze selber. Wenn meine Küvettenatzgerät nicht kaputt wäre Könnte ich auch ne höhere Stückzahl fahren aber ich versuche heute mal aufs gute alte Schalenätzen ne Prototypplatine hinzubekommen.
Mal sehen was draus wird

fuchs:
danke, mic, 
kann die lehrwerkstatt mit einer eagle layout-datei was anfangen? und was kostet eine einseitige platine ca. 10x16cm?
bei mir dauerts allerdings noch etwas, bis der schaltplan fertig ist.
die idee von shadowrun, das ganze modular zu machen finde ich auch nicht schlecht, aber ich möchte lieber alles auf einer platine haben.
der multiplexer kostet nur 1,60 euro , er schafft insgesamt 19 neue eingänge, und die programmierung ist auch nicht komplizierter, weil die 8 AD-Eingänge, die im ATMEGA32 schon vorhanden sind, ebenfalls "gemultiplext" werden.
mein konzept sieht jetzt so aus:
nur 1 Platine, auf der folgende funktionen drauf sind:
16 Analoge Eingänge (auch als Digitale Eingänge nutzbar) 
9 Digitale Eingänge (davon 3 als Drehzahleingäng nutzbar) 
8 Ausgänge (Digital oder PWM) 
4 frei konfigurierbare I/O-Ports (DigitalIn, DigitalOut, PWMOut, LCD-Ansteuerung, ....)
1 Ausgang für PC Ein/Aus
cu

the-x:
echt verdammt interesant wens dafür dann noch ne dll gibt und es unter 50&#8364; fertig kostet binn ich 100pro dabei

G-Punkt:
hmm.....eine Überlegung ging mir noch durch den Kopf: Wäre es möglich die Karte mit einfachen Befehlen z.B. aus Delphi (da kenn ich mich aus *g*) anzusteuern ? Und würdet ihr die Befehle an uns rausgeben.....oder Beispielprogramme oder sowas ?
Für mich wärs sehr interessant, da ich auf diesem Weg miene absolut individuellen Ideen verwirklichen kann, ohne erst lernen zu müssen wie man diese Relaiskarte baut und programmiert....

the-x:
g-punkt das meine ich ja mit ner dll :P

BigBeast:
Hi Leute hab gesehen das Ihr was drauf habtsin sachen Elektronik und ich hätte eine Frage und zwar ich hab eben mein Notebook im Wagen und das ist eben unterm Sitz verstaut!!
Nun hab ich das Problem das wenn ich mein Notebook einschalten will jedesmal &gt; Anschließen aller geräte &gt; aufklappen Startbutton betätigen &gt; zu klappen und wieder untern Sitz damit!!:twisted: 
nun mein Problem besteht darin das Notebook jedesmal aufzuklappen zum einschalten und das dauert mal seine Zeit !! Umständlich halbt
 :? 
nun gäbe es eine Möglich keit das Notebook einzuschalten ohne es aufzuklappen?? Vieleicht in Art einer Schaltung über USB od. So????
Ich hoff Ihr habt da was für mich oder zerbrecht eure Köpfe daran!!! :P

Heinz Tomato:
hmmm. vielleicht unterstützt das ding ja ein wakeup per externem keyboard?
Wenn das Notebook keine Garantie mehr hat, kann man natürlich auch einfach den button nach aussen verlegen, aber auf die idee bist du sicherlich schon selbst gekommen.

BigBeast:
Auf das bin ich auch schon gekommen wie du sagst bin eben EDV-Techniker hät ich mir selber gemacht aber das Notebook ist 
1. noch Garantie 2 Jahre
2. nicht meiner Firmen Notebook da ich alle meiner Geräte von meiner Firma spendiert bekomme
aber habt ihr noch ein paar vorschläge

Shadowrun:
Also den ATMegas kann man das komplette Tastaurprotokoll beibringen.
Somit wäre es theretisch möglich. Bin aber noch auf der Suche nach dem Sourcecode.
Will meine Lenkradfernbedieung an den PS2 Anschluß legen

BigBeast:
Hi deine Idee find ich Gut aber ich bräucht wie gesagt das alles über USB da ich kein PS/2 Anschluss am Notebook hab und über den COM Port hab ich das Engine Management drauf hängen also???

astro9481:
Hi! Ist zwar etwas off topic , aber:
Hat evtl einer die Möglichkeit für mich 2 Platinen zu ätzen? eine ist 35x85mm groß. Evtl vielleicht gleich 2 oder 3 auf eine und die dann einfach auseinander schneiden. Und was würde das kosten.
Oder weiß einer wo ich vielleicht so einStarterkit bekomme um Platinen zu ätzen!(günstig)
Ciao Marco

Shadowrun:
Du brauchst nur einmal Entwickler und einmal Säure (Eisen III Chlorid oder Natriumpersulfat)
Dann noch die Fotoplatinen + KlarsichtFolie für Drucker und etwas zum Belichten (zB 500 Watt Baustrahler ausm Baumarkt. Kostet 10 €)
Dann mußt du die Platine belicten ca 6 Min im abstand von 35 cm zum Baustrahler.
Dann entwickeln und dann ätzen

astro9481:
und wo bekomme ich das zeug am einfachsten?
was brauche ich denn für Entwickler

Longshine:
hat er doch gesagt: Eisen III Chlorid oder Natriumpersulfat

astro9481:
nur das das die Säure ist und was für Entwickler brauch ich?

Longshine:
ups, mein Fehler

Shadowrun:
Entwcikler heißt einfach so. Kanst auch NaOH (Natrium hydroxid) aber wenn du zu conrad oder so gehts heißt das 1x entwickler bitte.
Ich nutze da die Platinen von Bungard und deren entwickler.
Da ist die Platte sehr stail drinne.
Die Industriequalität da löst sich nach 10 sekunden der belichtete fotolack und nach weiteren 10 sekunden der belichtet. Man muß da also höllisch aufpassen. Der Bungard hält min 5 Min aus
