Autor
|
Thema: Taster als Schalter via AVR (Gelesen 152218 mal)
|
Fabeulous
Gast
|
So ich bin es mal wieder! Ich habe nun den ULN2803 angeschlossen! Das klappt auch alls sehr schön! Ich habe mal ein Lauflicht damit ausprobiert... guckt ihr hier -->Video man sieht es zwar nicht wirklich gut da die Led's sehr hell sind aber ich denke ein bischen erkennt man 
Hier nochmal das ganze als Bild:

Die kommenden tage wird wohl erstmal nix passieren da ich erstmal wieder Lötzinn einkaufen muss... Aber dann wird es weiter gehen: -der Max232 muss noch verkabelt werden -und noch ein paar taster anschlüsse...
Ach so ist es eigentlich normal das der ULN2803 sich etwas erwärmt? Ich denke mal ja aber ist es auch normal das die Widerstände der Led's heiß werden? Ich denke das das wahrschienlicha uch normal ist richtig?
|
|
|
Gespeichert
|
|
|
|
PoWl
Dremelfreund

Karma: +0/-0
Offline
Beiträge: 140
Atmel AVR Mikrocontroller
|
So, hier mal mein Senf dazu. Man kann an Port D 8 Taster gegen Masse anschließen. Pull-Ups sind schon im AVR aktiviert. An Port B hat man die 8 Ausgänge. Debounce ist softwareseitig auch schon drin.
.include "m8def.inc" ; Deklarationen für ATmega8
.equ in_port = PORTD ; Input Port .equ in_pin = PIND ; Input Pin
.equ out_port = PORTB ; Output Port .equ out_ddr = DDRB ; Output DDR
.equ start = 0b00000000 ; Startwert
.equ waitms = 1 ; Wartezeit für Debounce in ms .equ freq = 1000000 ; Takt in Hz
.cseg ; Programm-Flash ser R16 ; 0xFF ins Register R16 laden out out_ddr, R16 ; Port B als Ausgang definieren out in_port, R16 ; Pull-Up Widerstände aktivieren
ldi R16, start ; Startwert laden
; Arbeitsschleife ; R16 = Output Register ; R17 = Input Register ; R18 = Input Register kopie ; R19 = Letzter Input
; Tasterstatus laden und sichern loop: in R17, in_pin ; PortD in R17 laden mov R18, R17 ; R18 in R17 kopieren
; Lösche Bit in R17 wenn Bit in R19 = 1 com R19 ; R19 komplementieren and R17, R19 ; Lösche Bit in R17 wenn Bit in R19 = 0
; Letzten Input in R19 laden mov R19, R18 ; R18 in R19 kopieren
; Output ändern und ausgeben eor R16, R17 ; Komplementiere Bit in R16 wenn Bit in R17 = 1 out out_port, R16 ; R16 an PortB
; XL = R26 16Bit Counter Low ; XH = R27 16Bit Counter High .equ waitcircles = (((freq / 1000) * waitms) / 4) - 3
ldi XL, LOW(waitcircles) ; Zähler Low in R17 laden 1 Takt ldi XH, HIGH(waitcircles) ; Zähler High in R18 laden 1 Takt
wait: sbiw XL, 1 ; Zähler dekrementieren 2 Takte brne wait ; Springe zu wait wenn nicht 0 2 Takte bei != 0, 1 Takt bei == 0
rjmp loop ; Endlosschleife
Sry dass das so deformiert ist. Im AVR-Studio gehts dann. Einfach reinkopiern. Hoffe das funktioniert so, habs nich mehr getestet^^
mfg PoWl
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
Cool, danke! Ich werde mir das gleich mal angucken. Habe mich im Moment noch garnicht mit der Software beschäftigt... Danke
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
So... Ich bin mittlerwiele natürlich etwas weiter gekommen:
Die Hauptplatine ist soweit fertig gelötet... nun fehlt nur noch die Software...

Die Platine welche auf die Hauptplatine gesteckt wird und an welche die Relais angeschlossen sind und auch die Schraubklemmen für die Verbraucher...

Beides zusammengesteckt...

Das ganze habe ich schon recht kompakt mit dem restlichen Elektronikkram, wie Inverter für Kaltlichtkathoden oder ähnliches, in ein alte Hülle eines CD Rom laufwerks verbaut...
Kann mir noch jemand beantworten ob ich mir sorgen machen muss wenn der ULN2803 und die Vorwiderstände der LED's warm bzw. heiß werden?! Danke
|
|
|
Gespeichert
|
|
|
|
|
Fabeulous
Gast
|
Okay inwiefern meinste das und was kann man dagegen tun? Geht das "Störsenden" von den Kabneln aus oder von den Relais?! Brauche ich dann abgeschirmte Kabel?
|
|
|
Gespeichert
|
|
|
|
TzA
Modder der Apokalypse

Karma: +10/-0
Offline
Geschlecht: 
Beiträge: 1166

|
Stösenden tut da nix wesentliches, dafür ist das das alles zu niederfrequent. Ich hätte da eher Bedenken, dass sich mal ein Kabel löst und dann einen Kurzschluss verursacht, man könnte die Relais ja auch auf die Platine löten, dann fliegt nichts in der Gegend herum.
Ob du dir Sorgen wegen der Erwärmung machen musst, kommt darauf an wie groß diese ist. Bei den LED-Vorwiderständen kannst du ganz einfach ausrechnen, welche Leistung an ihnen abfällt, und dass mit der angegeben Maximalbelastbarkeit vergleichen. Beim ULN muss man im Prinzip den im Datenblatt angegebenen Wärmewiderstand (Junction to Case Ambient interessiert hier) und die maximale Temperatur nachsehen, daraus kann man dann die maximale Verlustleistung berechnen. Aber sofern das Gehäuse noch so kalt ist, dass man es dauerhaft anfassen kann, ohne sich die Finger zu verbrennen, ist es unbedenklich.
Edit: Junction to Ambient ist natürlich der benötigte Wärmewiderstand, thx@b0nze
|
|
« Letzte Änderung: August 11, 2007, 16:38:28 von TzA »
|
Gespeichert
|
You need only two tools. WD-40 and duct tape. If it doesn't move and it should, use WD-40. If it moves and shouldn't, use the tape
|
|
|
Fabeulous
Gast
|
Yoa okay dann lass ich die Verkabelung ersmal so... Anlöten wäre mir auch lieber, leider passen die Relais nicht auf das mein Rastermaß... Und ich werde die Relais natürlich auch noch im CD-Rom gehäuse befestigen... Der ULN2803 wird nur so warm das man ihn locker noch anfassen kann, die Widerstände dagegen weniger... ich werde das mal ausrechnen... Danke erstmal!
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
So jungs ich habe ein Problem... ich versuche die Fusebits einzustellen... Undzwar so das mein externes 8 Mhz Quarz als Taktgeber erkannt wird... ich habe jetzt alles gelesen aber irgendwie weis ich jetzt trotzdem ncith genau was ich da wo einstellen muss?! Könnte sich jemand erbarmen mir ein mini how to zu schreiben? In untertänigster Dankbarkeit und grenzenloser liebe Fabeulous
|
|
|
Gespeichert
|
|
|
|
PoWl
Dremelfreund

Karma: +0/-0
Offline
Beiträge: 140
Atmel AVR Mikrocontroller
|
Du musst bei deinem ATmega die Fuses CKSEL 3, 2 und 1 auf "1" stellen. Das bedeudet hier unprogrammed. Je nachdem was fürn progg du nutzt. Bei meinem Ponyprog bedeutet unchecked = 1 = unprogrammed. D.h. man muss die jeweiligen Checkboxen unchecken also leer machen, keine häkchen drin. CKOPT solltest du auch auf 1 stellen können.
Steht übrigens alles im Manual so drin^^ ich hoff mal ich hab das richtig interpretiert^^
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
Okay danke ich habe es gestern nochmal in einem waghalsigem eigenversuch versucht... hat wohl auch geklappt zumindest läuft bzw. lief der avr gestern immernoch... Aber dadurch machte sich direkt das nächste Prolem bekannt... Ich hab dann versucht per rs232 mit dem pc zu kommunizieren dazu habe ich einfach mal das kleine testprogramm aus dem tutorial von mikrocontroller.net benutzt... leider funktionierte das nicht... hat jemand eine idee woran das liegen könnte?
|
|
|
Gespeichert
|
|
|
|
|
Fabeulous
Gast
|
Sorry ich war gerade unter Zeitdruck weil mein Chef jheden moment reinplatzen konnte... Also nochmal ausführlich: Ich hab aus diesem Tutorial http://www.mikrocontroller.net...-Tutorial:_UART Diesen Code genommen:
.include "m8def.inc" .def temp = r16 .equ CLOCK = 4000000 .equ BAUD = 9600 .equ UBRRVAL = CLOCK/(BAUD*16)-1 ; Stackpointer initialisieren ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ; Baudrate einstellen ldi temp, HIGH(UBRRVAL) out UBRRH, temp ldi temp, LOW(UBRRVAL) out UBRRL, temp ; Frame-Format: 8 Bit ldi temp, (1<<URSEL)|(3<<UCSZ0) out UCSRC, temp sbi UCSRB,TXEN ; TX aktivieren loop: ldi temp, 'T' rcall serout ; Unterprogramm aufrufen ldi temp, 'e' rcall serout ; Unterprogramm aufrufen ldi temp, 's' rcall serout ; ... ldi temp, 't' rcall serout ldi temp, '!' rcall serout ldi temp, 10 rcall serout ldi temp, 13 rcall serout rjmp loop serout: sbis UCSRA,UDRE ; Warten bis UDR für das nächste ; Byte bereit ist rjmp serout out UDR, temp ret ; zurück zum Hauptprogramm Hyper Terminal habe ich dann auch so eingestellt wie es angegeben war... nur leider kommt bei Hyper Terminal garnichts an! Also der Bildschirm bliebt weis...
Ich werde es jetzt nochmal probieren... Danke
EDIT: So nun geht es... zumindest empfängt er etwas aber es komtm nur buchstabensalat an... falls es hilft ungefähr sowas 
oï!„w„»8¿!„ww„w„w„ï!„w„ï!„w„„w„w„„w„w„~Ý„w„ww„w„w„ôw„w„w!„w„w„î„w„w„ï!„w„wG w„w„w„w„w8„w„w„w„w„w„„w„w„ï!„w„Ó»8¿!„!„w„w„w„w„wï!„w„ôw„w„ww„w„wï!„w„wï!„w„w „w„w!„w„wG¿!„w„ôw„w„wï!„w„†~Ý„w„~Ý„w„w Ich habe leider keien Ahnung woran es liegt... 
EDIT Again: So jetzt geht es!  Es lag daran das bei der Variable Clock 4000000 eingestellt war... ich hab mir einfach mal gedacht das steht für den Wert der Taktfrequenz. ICh habe das ganze dann auf 8000000 gestellt und nun geht es mit dem Testprogramm!
|
|
« Letzte Änderung: August 13, 2007, 16:26:51 von Fabeulous »
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
So Sorry für die ganzen Doppelposts aber sonst merkt ihr ja nicht das hier was neues ab geht  Also wie geh ich das denn jetzt am besten an?! Ich mein Programmiertechnisch ist das ja nicht so ganz einfach da ja am PORTC sowohl Eingänge der Taster als auch Ausgänge der LED's hängen...
Ich hab mir gedacht das das bestimmt mit so befehlen wie cbi und sbi funktionieren kann nur leider habe ich noch keine genaue vorstellung wie ich anfangen soll...
Bisher habe ich nur die Anfangskonfiguration der einzelnen Pins
.include "m8def.inc" sbi DDRC, 0 ; Bit 0 DDRC auf 1 setzen -> Ausgang sbi DDRC, 1 ; Bit 1 DDRC auf 1 setzen -> Ausgang sbi DDRC, 2 ; Bit 2 DDRC auf 1 setzen -> Ausgang sbi DDRC, 3 ; Bit 3 DDRC auf 1 setzen -> Ausgang sbi DDRC, 4 ; Bit 4 DDRC auf 1 setzen -> Ausgang sbi DDRC, 5 ; Bit 5 DDRC auf 1 setzen -> Ausgang
sbi DDRD, 2 ; Bit 2 DDRD auf 1 setzen -> Ausgang sbi DDRD, 3 ; Bit 3 DDRD auf 1 setzen -> Ausgang
cbi DDRB, 0 ; Bit 0 DDRB auf 0 setzen -> Eingang cbi DDRB, 1 ; Bit 1 DDRB auf 0 setzen -> Eingang cbi DDRB, 2 ; Bit 2 DDRB auf 0 setzen -> Eingang cbi DDRB, 3 ; Bit 3 DDRB auf 0 setzen -> Eingang cbi DDRB, 4 ; Bit 4 DDRB auf 0 setzen -> Eingang cbi DDRB, 5 ; Bit 5 DDRB auf 0 setzen -> Eingang
cbi DDRD, 6 ; Bit 6 DDRD auf 0 setzen -> Eingang cbi DDRD, 7 ; Bit 7 DDRD auf 0 setzen -> Eingang
sbi PORTB, 0 ; Bit 0 im IO-Register PORTB auf 1 setzen -> Pull-Up Ein sbi PORTB, 1 ; Bit 1 im IO-Register PORTB auf 1 setzen -> Pull-Up Ein sbi PORTB, 2 ; Bit 2 im IO-Register PORTB auf 1 setzen -> Pull-Up Ein sbi PORTB, 3 ; Bit 3 im IO-Register PORTB auf 1 setzen -> Pull-Up Ein sbi PORTB, 4 ; Bit 4 im IO-Register PORTB auf 1 setzen -> Pull-Up Ein sbi PORTB, 5 ; Bit 5 im IO-Register PORTB auf 1 setzen -> Pull-Up Ein
sbi PORTD, 6 ; Bit 5 im IO-Register PORTD auf 1 setzen -> Pull-Up Ein sbi PORTD, 7 ; Bit 5 im IO-Register PORTD auf 1 setzen -> Pull-Up Ein
ende: rjmp ende ; Sprung zur Marke "ende" -> Endlosschleife
vlt. ist das ja schon ein anfang!?
|
|
|
Gespeichert
|
|
|
|
PoWl
Dremelfreund

Karma: +0/-0
Offline
Beiträge: 140
Atmel AVR Mikrocontroller
|
Hm, ganz schön arg viel aufwand, Register mit einzelnen Werten zu belegen und dann an den Port auszugeben ist dahingegen etwas einfacher :-)
ldi R16, 0b00111111 out DDRC, R16 out PORTB, R16
ldi R16, 0b00001100 out DDRD
ldi R16, 0b11000000 out PORTD
Um einen Port als Eingang zu definieren brauchst du das DDR nicht mit nullen zu belegen da es das nach dem Reset sowieso schon ist.
So, was jetzt kommt ist dass du in einer schleife erstmal bei jedem durchlauf die Taster abfragen musst, am besten du ließt PinC ein, dann PinD in ein anderes Register, setzt die bitpositionen 2 und 3 mit swap nach 6 und 7 und fügst die beiden register mit or zusammen. dann hast du erstmal den status aller 8 taster in einem register.
Schauen wir uns Taster1 an. Taster 1 hat die Bitposition 0. Nun müssen wir um dafür bei gedrückter Taster, also ist an der 0ten bitposition eine logische 0, da der taster ja nach masse zieht, eine aktion auszuführen und verhindern dass diese Aktion beim nächsten durchlauf nochmal ausgeführt wird. Dazu müssen wir bei diesem Schleifendurchlauf wissen ob der Taster im letzten durchlauf schon gedrückt war. Ist dem nun so, müssen wir unsere logische 0 an unserer bitposition für taster1 wieder in eine logische 1 verwandeln um zu verhindern dass die entsprechende aktion ausgeführt wird. Assembler bzw der µC selbst stellt befehle bereit mit denen man das für alle 8 bits gleichzeitig machen kann.
Wie sowas im programm aussieht hab ich ja schonmal gepostet, allerdings war da noch ein fehler drin.. das programm war auf taster ausgelegt die auf Vcc ziehen^^ war mein erstes programm und da wusste ich noch nicht so recht dass man die dinger eher auf masse ziehn lässt^^
naja, hf.. ciao Powl
|
|
|
Gespeichert
|
|
|
|
|