|
Autor |
Nachricht |
fuchs
Developer
Alter: 53
Anmeldung: 04.04.2004
Beiträge: 1319
Wohnort: Friesland
|
|
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!)
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
Manchmalposter
Alter: 41
Anmeldung: 26.12.2004
Beiträge: 97
Wohnort: Neumarkt
|
|
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
Forumjunkie
Alter: 41
Anmeldung: 18.04.2004
Beiträge: 718
Wohnort: Ostfriesland
2005 Volkswagen Passat
|
|
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
Developer
Alter: 53
Anmeldung: 04.04.2004
Beiträge: 1319
Wohnort: Friesland
|
|
@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
Forumjunkie
Alter: 41
Anmeldung: 18.04.2004
Beiträge: 718
Wohnort: Ostfriesland
2005 Volkswagen Passat
|
|
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
Forumkenner
Alter: 53
Anmeldung: 06.10.2004
Beiträge: 127
Wohnort: Bochum
|
|
So, frohes Neues erst einmal. Ich hoffe ihr seid alle gut reingekommen.
Hallo Fuchs und vik,
endlich mal Leute die Ahnung haben.
Bin begeistert von eurer Idee.
Ich hatte mir an anderer Stelle schon einmal Gedanken um der wünschenswerten Funktionen einer Ein-Ausgangs Relaiskarte gemacht.
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.
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.
Gruß aus Bo
Mic
|
|
|
|
|
|
|
|
|
fuchs
Developer
Alter: 53
Anmeldung: 04.04.2004
Beiträge: 1319
Wohnort: Friesland
|
|
@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
Forumkenner
Alter: 53
Anmeldung: 06.10.2004
Beiträge: 127
Wohnort: Bochum
|
|
@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
Developer
Alter: 53
Anmeldung: 04.04.2004
Beiträge: 1319
Wohnort: Friesland
|
|
@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
Forumjunkie
Alter: 41
Anmeldung: 18.04.2004
Beiträge: 718
Wohnort: Ostfriesland
2005 Volkswagen Passat
|
|
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
Foruminventar
Anmeldung: 21.04.2004
Beiträge: 1129
|
|
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
Inputsammler
Anmeldung: 23.08.2004
Beiträge: 33
|
|
@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
Developer
Alter: 53
Anmeldung: 04.04.2004
Beiträge: 1319
Wohnort: Friesland
|
|
@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
Inputsammler
Anmeldung: 23.08.2004
Beiträge: 33
|
|
@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
Developer
Alter: 53
Anmeldung: 04.04.2004
Beiträge: 1319
Wohnort: Friesland
|
|
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 )
|
|
|
|
|
|
|
|
Shadowrun
Foruminventar
Anmeldung: 21.04.2004
Beiträge: 1129
|
|
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
Developer
Alter: 53
Anmeldung: 04.04.2004
Beiträge: 1319
Wohnort: Friesland
|
|
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
|
|
|
|
Zuletzt bearbeitet von fuchs am Do 06 Jan, 2005 18:15, insgesamt einmal bearbeitet
|
|
|
|
Shadowrun
Foruminventar
Anmeldung: 21.04.2004
Beiträge: 1129
|
|
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
Forumkenner
Alter: 53
Anmeldung: 06.10.2004
Beiträge: 127
Wohnort: Bochum
|
|
Euer Tempo ist bemerkenswert. Weiter so.
Gruß
Mic
|
|
|
|
|
|
|
|
G-Punkt
Moderator a.D.
Alter: 37
Anmeldung: 24.05.2004
Beiträge: 154
Wohnort: Hamburg
1995 BMW 3 Series
|
|
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
|
|
|
|
|
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten Du kannst Dateien in diesem Forum nicht herunterladen
|
|
|