Car-PC.info

Relaiskarten - lowcost io-karte mit atmel atmega kontroller

fuchs - Fr 31 Dez, 2004 03:45
Titel: lowcost io-karte mit atmel atmega kontroller
hi,

inspiriert durch shadowrun's thread

http://www.car-pc.info/phpBB2/viewtopic.php?t=3948&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!)

Image

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 - Sa 01 Jan, 2005 18:29
Titel:
Hi erstmal ein gutes Neues Jahr 2. 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 Projekt interresiert!

Mfg Flo
Vik - Sa 01 Jan, 2005 20:23
Titel:
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 - Sa 01 Jan, 2005 21:23
Titel:
@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 - So 02 Jan, 2005 03:10
Titel:
fuchs hat folgendes geschrieben:
...hast du deine AVRs mit assembler oder in c programmiert?

In Basic (bitte nich hauen Wink) 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 02 Jan, 2005 14:22
Titel:
So, frohes Neues erst einmal. Explosive smile 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 Banana

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 auf PC Startfunktion ausführen.
- Kontakt Eingang Zentralverriegelungsimpuls AUF (sowohl + gesteuert als auch – gesteuert)
Funktion: Sollte bei Kontakt ZV auf PC Startfunktion ausführen.

- Kontakt Eingang Zentralverriegelungsimpuls ZU(sowohl + gesteuert als auch – gesteuert)
Funktion: Sollte bei Kontakt ZV zu PC 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 => 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 - So 02 Jan, 2005 19:29
Titel:
@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 Wink
Mic - So 02 Jan, 2005 20:44
Titel:
@fuchs: Bin ja jetzt 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 - Mo 03 Jan, 2005 01:51
Titel:
@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 - Mo 03 Jan, 2005 02:18
Titel:
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 - Mo 03 Jan, 2005 15:30
Titel:
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 "m16def.inc"       ;bzw. 2333def.inc


.def temp1 = r21
.def temp2 = r22
.def temp3 = r23

;#############################################################################
;############ Stack initialisieren um Unterprogramme aufzurufen ##############
;#############################################################################

         ldi r16, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse
         out SPL, r16
         ldi r16, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse
         out SPH, r16
;#############################################################################

         
         
;#############################################################################
;###########         Startwerte setzen      ##############
;#############################################################################
         ldi r16, 0xFF
         out DDRB, r16       ;Port B durch Ausgabe von 0xFF ins
                             ;Richtungsregister DDRB als Ausgang konfigurieren
         ldi r16, 0xFF
         out DDRC, r16       ;Port C durch Ausgabe von 0xFF ins
                             ;Richtungsregister DDRB als Ausgang konfigurieren
         ldi r16, 0x00
         out DDRD, r16       ;Port D durch Ausgabe von 0x00 ins
                             ;Richtungsregister DDRD als Eingang konfigurieren

         ldi r16, 0xFF
         out PORTB, r16      ;PORTB auf 0xFF setzen -> alle LEDs aus
         
         rcall lcd_init      ;Display initialisieren
         rcall lcd_clear     ;Display löschen
   
    rcall setze1        ; Taste 1 wurde gerückt zum Start des Prgoramms
;#############################################################################   
   
   
;#############################################################################
;###########         Hauptprogramm         ##############
;#############################################################################
main:

   sbrs r20,1            ; Ist im Arbeitsregister 20 das 2 Bit null so wurde Taste 1 gedrückt und lauflicht 1 wird ausgeführt
   rcall lauflicht1

   sbrs r20,2
   rcall lauflicht2

   sbrs r20,3
   rcall lauflicht3

   sbrs r20,4
   rcall lauflicht4
   
   sbrs r20,5
        rcall lauflicht5

rjmp main
;#############################################################################


;#############################################################################
;###########         Hauptprogramm         ##############
;#############################################################################   
lese:
   sbis PIND,2      ; Ist im Inputregister das 2 Bit null so wird Taste 1 gedrückt und setzte 1 wird ausgeführt
   rcall setze1
   
   sbis PIND,3
   rcall setze2 
   
   sbis PIND,4
   rcall setze3
   
   sbis PIND,5
   rcall setze4
   
   sbis PIND,6
   rcall setze5 
ret
;#############################################################################


;#############################################################################
;###########         Hauptprogramm         ##############
;#############################################################################
setze1:
   ldi r20, 0b11111101 ;Arbeitsregister 20 wird auf 11111101 gesetzt
   rcall schreibe      ; schreibe wird ausgeführt
   
        ldi temp1, '1'      ;Zeichen '1' ans Dislpay senden
        rcall lcd_data      ;        "
ret
;#############################################################################


;#############################################################################
;###########         Hauptprogramm         ##############
;#############################################################################
setze2:
   ldi r20, 0b11111011
   rcall schreibe
        ldi temp1, '2'     ;Zeichen anzeigen
        rcall lcd_data
ret
;#############################################################################


;#############################################################################
;###########         Hauptprogramm         ##############
;#############################################################################
setze3:
   ldi r20, 0b11110111
   rcall schreibe
        ldi temp1, '3'     ;Zeichen anzeigen
        rcall lcd_data
ret
;#############################################################################


;#############################################################################
;###########         Hauptprogramm         ##############
;#############################################################################
setze4:
   ldi r20, 0b11101111
   rcall schreibe
        ldi temp1, '4'     ;Zeichen anzeigen
        rcall lcd_data
ret
;#############################################################################


;#############################################################################
;###########         Hauptprogramm         ##############
;#############################################################################
setze5:
   ldi r20, 0b11011111
   rcall schreibe
        ldi temp1, '5'     ;Zeichen anzeigen
        rcall lcd_data
ret
;#############################################################################



;#############################################################################
;###########   Proceduer Schreibe               ##############
;#############################################################################
schreibe:
           rcall lcd_clear    ;Display löschen      
           
           ldi temp1, 'L'     ;Schreibt 'Lauftlicht Nr ' ins Display
           rcall lcd_data

           ldi temp1, 'a'     
           rcall lcd_data
           
           ldi temp1, 'u'     
           rcall lcd_data

           ldi temp1, 'f'     
           rcall lcd_data

           ldi temp1, 'l'     
           rcall lcd_data

           ldi temp1, 'i'     
           rcall lcd_data

           ldi temp1, 'c'     
           rcall lcd_data

           ldi temp1, 'h'     
           rcall lcd_data   

           ldi temp1, 't'     
           rcall lcd_data 

           ldi temp1, ' '     
           rcall lcd_data                         

           ldi temp1, 'N'     
           rcall lcd_data
           
           ldi temp1, 'r'     
           rcall lcd_data           

           ldi temp1, ' '     
           rcall lcd_data           
ret
;#############################################################################



;#############################################################################
;###########         Procedure Warte         ##############
;#############################################################################
warte:
; delaying 199998 cycles:      ;Es werden 199998 Dürchgänge nix getan
          ldi  R17, $06
WGLOOP0:  ldi  R18, $37
WGLOOP1:  ldi  R19, $C9
WGLOOP2:  dec  R19
     rcall lese           ; Aber dazwischen wird bei jedem Schritt noch mal der Inputport gelesen
          brne WGLOOP2
          dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; -----------------------------
ret


;#############################################################################
;###########  Die verscheidenen Lauflichter und LCD Proceduren  ##############
;#############################################################################

lauflicht1:
           
   ldi r16,0b00111111
   out PORTB, r16

   rcall warte
      
   ldi r16,0b11001111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11110011
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11111100
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11111111
   out PORTB, r16

   rcall warte

ret

lauflicht2:
   ldi r16,0b11111110
   out PORTB, r16

   rcall warte
      
   ldi r16,0b11111011
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11101111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b10111111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b01111111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11011111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11110111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11111101
   out PORTB, r16

   rcall warte

ret

lauflicht3:
   ldi r16,0b11111100
   out PORTB, r16

   rcall warte
      
   ldi r16,0b11110000
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11000000
   out PORTB, r16

   rcall warte
   
   ldi r16,0b00000000
   out PORTB, r16

   rcall warte
   
   ldi r16,0b00000011
   out PORTB, r16

   rcall warte
   
   ldi r16,0b00001111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b00111111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11111111
   out PORTB, r16

   rcall warte

ret

lauflicht4:
   ldi r16,0b11111010
   out PORTB, r16

   rcall warte
      
   ldi r16,0b11101011
   out PORTB, r16

   rcall warte
   
   ldi r16,0b10101111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b00111111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b01011111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11010111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11110101
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11111100
   out PORTB, r16

   rcall warte

ret

lauflicht5:
   ldi r16,0b11111111
   out PORTB, r16

   rcall warte
      
   ldi r16,0b00111111
   out PORTB, r16

   rcall warte
   
   ldi r16,0b00111100
   out PORTB, r16

   rcall warte
   
   ldi r16,0b00001100
   out PORTB, r16

   rcall warte
   
   ldi r16,0b00000000
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11000000
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11000011
   out PORTB, r16

   rcall warte
   
   ldi r16,0b11110011
   out PORTB, r16

   rcall warte
   

ret


 ;sendet ein Datenbyte an das LCD
lcd_data:
           mov temp2, temp1             ;"Sicherungskopie" für
                                        ;die Übertragung des 2.Nibbles
           swap temp1                   ;Vertauschen
           andi temp1, 0b00001111       ;oberes Nibble auf Null setzen
           sbr temp1, 1<<4              ;entspricht 0b00010000
           out PORTC, temp1             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
                                        ;2. Nibble, kein swap da es schon
                                        ;an der richtigen stelle ist
           andi temp2, 0b00001111       ;obere Hälfte auf Null setzen
           sbr temp2, 1<<4              ;entspricht 0b00010000
           out PORTC, temp2             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
           rcall delay50us              ;Delay-Routine aufrufen
           ret                          ;zurück zum Hauptprogramm

 ;sendet einen Befehl an das LCD
lcd_command:                            ;wie lcd_data, nur ohne RS zu setzen
           mov temp2, temp1
           swap temp1
           andi temp1, 0b00001111
           out PORTC, temp1
           rcall lcd_enable
           andi temp2, 0b00001111
           out PORTC, temp2
           rcall lcd_enable
           rcall delay50us
           ret

 ;erzeugt den Enable-Puls
lcd_enable:
           sbi PORTC, 5                 ;Enable high
           nop                          ;3 Taktzyklen warten
           nop
           nop
           cbi PORTC, 5                 ;Enable wieder low
           ret                          ;Und wieder zurück                     

 ;Pause nach jeder Übertragung
delay50us:                              ;50us Pause
          ldi  temp1, $02
EGLOOP0:  ldi  temp2, $84
EGLOOP1:  dec  temp2
          brne EGLOOP1
          dec  temp1
          brne EGLOOP0                      ;wieder zurück

 ;Längere Pause für manche Befehle
delay5ms:                               ;5ms Pause
          ldi  temp1, $86
PGLOOP0:  ldi  temp2, $C6
PGLOOP1:  dec  temp2
          brne PGLOOP1
          dec  temp1
          brne PGLOOP0
           ret                          ;wieder zurück

 ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
           ldi   temp3,50
powerupwait:
           rcall   delay5ms
           dec   temp3
           brne   powerupwait
           ldi temp1, 0b00000011        ;muss 3mal hintereinander gesendet
           out PORTC, temp1             ;werden zur Initialisierung
           rcall lcd_enable             ;1
           rcall delay5ms
           rcall lcd_enable             ;2
           rcall delay5ms
           rcall lcd_enable             ;und 3!
           rcall delay5ms
           ldi temp1, 0b00000010        ;4bit-Modus einstellen
           out PORTC, temp1
           rcall lcd_enable
           rcall delay5ms
           ldi temp1, 0b00101000        ;noch was einstellen...
           rcall lcd_command
           ldi temp1, 0b00001100        ;...nochwas...
           rcall lcd_command
           ldi temp1, 0b00000100        ;endlich fertig
           rcall lcd_command
           ret

 ;Sendet den Befehl zur Löschung des Displays
lcd_clear:
           ldi temp1, 0b00000001   ;Display löschen
           rcall lcd_command
           rcall delay5ms
           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 - Di 04 Jan, 2005 18:23
Titel:
@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 - Di 04 Jan, 2005 21:49
Titel:
@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;
      /*Funktionsaufrufe VOR den Zeitscheibenfunktionen*/

      startfunktion();

while (1) /* schleife unendlich wiederholen */

      counter++; /* Es wird die naechste Zeitscheibe "adressiert" */
      if (counter & 0x01)
         /*Funktionen alle 5 ms*/
         funktion_5ms_1();  /*Zeitkritische funktion 1*"
         funktion_5ms_2();  /*Zeitkritische funktion 2*"
         usw...
          else
         if (counter & 0x02)
          /*Funktionen alle 10 ms*/
         funktion_10ms_1(); 
         funktion_10ms_2(); 
         usw....
         else
            if (counter & 0x04)
               /*Funktionen alle 20 ms*/
         funktion_20ms_1();  /*Zeitunkritische Funktion 1*/
         funktion_20ms_2();  /*Zeitunkritische Funktion 2*/
            else
               if ((counter & 0x08) != 0)
                  /*Zähler zurücksetzen*/
                  counter = 0;



compucat - Mi 05 Jan, 2005 01:46
Titel:
@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 - Do 06 Jan, 2005 00:57
Titel:
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.

Image

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 - Do 06 Jan, 2005 12:30
Titel:
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 - Do 06 Jan, 2005 14:13
Titel:
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 - Do 06 Jan, 2005 15:52
Titel:
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 Funktion und eine Funktion meine Lenkradfernbedieung anzuschließen und zwar über den PS2 Tastatur Anschluß.

Wenn das läuft kann man ja seine Port wenn man denn mehr braucht erweitern
Mic - Fr 07 Jan, 2005 20:28
Titel:
Euer Tempo ist bemerkenswert. Weiter so.

Gruß

Mic
G-Punkt - Do 13 Jan, 2005 02:03
Titel:
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 - Do 13 Jan, 2005 08:17
Titel:
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 - Do 13 Jan, 2005 14:21
Titel:
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&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 - Do 13 Jan, 2005 17:02
Titel:
@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 - Do 13 Jan, 2005 17:36
Titel:
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 - Do 13 Jan, 2005 17:47
Titel:
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 - Do 13 Jan, 2005 18:27
Titel:
echt verdammt interesant wens dafür dann noch ne dll gibt und es unter 50€ fertig kostet binn ich 100pro dabei
G-Punkt - Do 13 Jan, 2005 19:11
Titel:
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 - Fr 14 Jan, 2005 00:49
Titel:
g-punkt das meine ich ja mit ner dll Razz
BigBeast - Mo 24 Jan, 2005 14:18
Titel:
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 > Anschließen aller geräte > aufklappen Startbutton betätigen > zu klappen und wieder untern Sitz damit!! Twisted Evil

nun mein Problem besteht darin das Notebook jedesmal aufzuklappen zum einschalten und das dauert mal seine Zeit !! Umständlich halbt

Confused

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!!! Razz
Heinz Tomato - Mo 24 Jan, 2005 14:20
Titel:
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 - Mo 24 Jan, 2005 14:28
Titel:
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 - Mo 24 Jan, 2005 15:06
Titel:
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 - Mo 24 Jan, 2005 21:08
Titel:
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 - Di 15 Feb, 2005 17:53
Titel:
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 ein Starterkit bekomme um Platinen zu ätzen!(günstig)

Ciao Marco
Shadowrun - Di 15 Feb, 2005 19:38
Titel:
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 - Di 15 Feb, 2005 19:41
Titel:
und wo bekomme ich das zeug am einfachsten?
was brauche ich denn für Entwickler
Longshine - Di 15 Feb, 2005 19:49
Titel:
hat er doch gesagt: Eisen III Chlorid oder Natriumpersulfat
astro9481 - Di 15 Feb, 2005 19:50
Titel:
nur das das die Säure ist und was für Entwickler brauch ich?
Longshine - Di 15 Feb, 2005 20:06
Titel:
ups, mein Fehler
Shadowrun - Mi 16 Feb, 2005 10:32
Titel:
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
Alle Zeiten sind GMT + 1 Stunde
Powered by phpBB2 Plus and Kostenloses Forum based on phpBB