hallo leute, im simulator wird der int0 ausgelöst, aber offensichtlich nicht im µC. initialisiere ich den etwa falsch? probiere schon den ganzen tag und fragmich was los ist? zur beschreibung: es wird eine tauchlampe (bp2), die mit einem taster (pb1) in 4 leistungsstufen (pwm) geschaltet werden kann. .INCLUDE "tn12def.inc" ;Konstanten .equ clock = 1200000 ;Taktfrequenz 1,2MHz .equ RISING = 0b00110011 ;0x03 steigende Flanke + Sleep Enabled .equ FALLING = 0b00110010 ;0x02 fallende Flanke + Sleep Enabled .def SaveSReg = r16 ;Statusregister Merker .def ModulStatus = r17 ;0 Lampe aus 0V ;1 Lampe 50% 6V ;2 Lampe 75% 9V ;3 Lampe 100% 12V .def LampePort = r18 ;Ausgangsregeiter .def Timer1 = r19 ;Zähler 1 .def Timer2 = r20 ;Zähler 2 .def TempReg = r21 ;Allgmeines Register ;Pinbelegung ;PB2 Ausgangstreiber (Lampe) ;PB1 TLE4905 (Taster) ;****************************************************************** .cseg ;CODE segment .org 0 rjmp Reset ;Resethandler .org INT0addr rjmp EXT_INT_Taster ;Interrupthandler .org 32 Reset: ;Kalibrierung interne RC ldi ZL, low (flashend * 2) ldi ZH, high (flashend * 2) lpm ser ZL cpse r0, ZL out OSCCAL, r0 ;Portrichtung ldi TempReg, 0b00000100 ;PB2 -> Ausgang out DDRB, TempReg ;Pull Up's an allen Eingängen ldi TempReg, 0b11111111 ;für alle Pins Pull Up R's out PORTB, TempReg ;und Lampe aus -> PB2 = H ;Lampenzustand merken ldi LampePort, 0xFF ;Modulstatus Lampe aus ldi ModulStatus, 0x00 ;fallende Flanke löst Interupt aus + Sleep enabled ldi TempReg, FALLING ;highLow initialisieren. out MCUCR, TempReg ldi TempReg, (1<<INT0) ;Enable externen Interrupt out GIMSK, TempReg ;Enable Interrupts sei start: cpi ModulStatus, 0x00 ;Lampe aus breq Lampe0 cpi ModulStatus, 0x01 ;Lampe 50% breq Lampe1 cpi ModulStatus, 0x02 ;Lampe 75% breq Lampe2 cpi ModulStatus, 0x03 ;Lampe an breq Lampe3 rjmp start EXT_INT_Taster: ; Statusregister sichern in SaveSReg, SREG inc ModulStatus cpi ModulStatus, 0x04 brne IntExit ;wenn 4 noch nicht erreicht, dann ende ;wenn status 4 erreicht , dann Starus = 0 ldi ModulStatus, 0x00 IntExit: ;Statusregister zurückschreiben out SREG, SaveSReg reti Lampe0: ;Lampe aus ldi LampePort, 0xFF ;Lampe aus -> PB2 = H out PORTB, LampePort sleep rjmp start Lampe1: ;Lampe 50% ldi LampePort, 0x00 ;Lampe an -> PB2 = L out PORTB, LampePort rcall Wait_5ms rcall Wait_5ms ldi LampePort, 0xFF ;Lampe aus -> PB2 = H out PORTB, LampePort rcall Wait_5ms rcall Wait_5ms rjmp start Lampe2: ;Lampe 75% ldi LampePort, 0x00 ;Lampe an -> PB2 = L out PORTB, LampePort rcall Wait_5ms rcall Wait_5ms rcall Wait_5ms ldi LampePort, 0xFF ;Lampe aus -> PB2 = H out PORTB, LampePort rcall Wait_5ms rjmp start Lampe3: ;Lampe an ldi LampePort, 0x00 ;Lampe an -> PB2 = L out PORTB, LampePort sleep rjmp start Wait_5ms: ; delaying 6038 cycles: ldi Timer1, 20 ;0x14 Dezimal = 20 TimeLoop1: ldi Timer2, 100 ;0x64 Dezimal = 100 TimeLoop2: dec Timer2 brne TimeLoop2 dec Timer1 brne TimeLoop1 ret Danke Fred
ich weiß nicht mehr weiter! wenn ich den pb1 mit dem taster des stk auf masse ziehe, messe ich immer noch 0,6V! obwohl er auf eingang initialisiert ist. Versuch 1 pin direck mit 200R nach masse fließen 5mA -> deutet auf Ausgang Versuch 2 testprogramm geschrieben alle Pins auf Ausgang, led's dran, ausgange durchgeschalten iO Versuch 3 alle Pin's auf eingang initialiesiert, pin mit 200R nach masse fließen 5mA -> Tiny defekt? Versuch 4 funkelnagelneuer Tiny das gleich wie in Versuch 3 ich denke ich mache bei der initalisierung was falsch, kann mal einer schauen, bin mit meinem latein am ende!!! danke im voraus fred
Hi ! hab zwar noch nicht die Ahnung von Assembler (hab grade mein erstes zum Laufen bekommen) aber schalte mal nur das bit für die Lampe. du nimmst und setzt die pullups jedesmal mit. Was ist mit Tastenprellen? 1x tasten und wahrscheinlich rauscht Du schon zig mal durch die ISR. (suche mal hier im Forum) Habe das Programm grade mal etwas abgewandelt auf meinem STK 500 mit Tiny 12 probiert. Taste gedrückt und Lampe dauerleuchten. Wenn ich das richtig verstanden habe, (bin auch Neuling) legst Du die cpu schlafen. nach einem int gehst du einmal in die routine und für 5-15ms je nach status leuchtet die lampe. dann machst du sie wieder aus und die cpu pennt bis zum nächsten tasten. grüße jürgen
WARNUNG Tiny12 im STK500, wenn man einem Tiny12 was beibringen will ist das bord völlich ungeeignet, zumindest wenn mann einen Ext Int braucht!!! normale verdratung Rst ->PB5 Xti ->PB2 das bord legt ein, was weiß der geier, signal an PB1!!!!! (alle jumper [vorallem AREF] ausprobiert) ich glaube nicht, das es nur mein bord betrifft!!!! abgesehen, von der umstädlichen verkabelung, kann man den µC nur testen, wenn PB1 nicht im sockel ist (rechtwinklich raustehend)! ein ISP ist aber nur mit pin im sockel möglich. und das gibt er spätesten nach dem fünften hin und her biegen auf. mfg Fred
Hallo Jürgen das ist richtig, aber mein problem ist das die ISR NIE angespungen wird! weil ich den PB1 nie auf <0.5V, ohne das es raucht, bekomme! (bekommen habe) mfg Fred
Hi ! @Fred: Werde ich mir nachher mal mit dem Oscar ansehen. @gast: Habe meinen Tiny 12 als Baustein für meine Koax Heli Beleuchtung. Der bekommt von der Funke alle 20ms einen Puls zwischen 1,12 und 1,84 ms Der springt wie er soll bei steigender und fallender Flanke. Wie sieht Deine Restschaltung denn aus ?? Laß uns nicht raten Gruß Jürgen
Hi! grade ausprobiert! STK500 mit ATTiny .INCLUDE "tn12def.inc" ;Konstanten .equ clock = 1200000 ;Taktfrequenz 1,2MHz .equ FALLING = 0b00000010 ;0x02 fallende Flanke + ;sleep Enabled .def SaveSReg = r16 ;Statusregister Merker .def LED_Port = r18 ;Ausgangsregeiter .def Timer1 = r19 ;Zähler 1 .def Timer2 = r20 ;Zähler 2 .def tempreg =r21 .def LED_pb2 = r22 ;Pinbelegung ;PB2 Ausgangstreiber (Lampe) ;PB1 TLE4905 (Taster) ;****************************************************************** .cseg ;CODE segment .org 0 rjmp Reset ;Resethandler .org INT0addr rjmp EXT_INT_Taster ;Interrupthandler .org 32 Reset: ;Kalibrierung interne RC ldi ZL, low (flashend * 2) ldi ZH, high (flashend * 2) lpm ser ZL cpse r0, ZL out OSCCAL, r0 ;Portrichtung ldi TempReg, 0b11111101 ;PB2 -> Ausgang out DDRB, TempReg ;Pull Up's an allen Eingängen ldi TempReg, 0b11111001;für alle Pins Pull Up R's out PORTB, TempReg ;und Lampe an cbr LED_Port, (1<<pb2) sbr LED_pb2, (1<<pb2) ldi TempReg, FALLING ;highLow initialisieren. out MCUCR, TempReg ldi TempReg, (1<<INT0) ;Enable externen Interrupt out GIMSK, TempReg ;Enable Interrupts sei start: rjmp start EXT_INT_Taster: ; Statusregister sichern in SaveSReg, SREG eor LED_Port, LED_pb2 out PORTB, LED_Port IntExit: ;Statusregister zurückschreiben out SREG, SaveSReg reti ____________________ schnipp__________________________________ Bei jedem Tastendruck auf switch 7 (sucht euch einen aus) wird LED 2 getoggelt. auch hier könnt ihr euch eine aussuchen. Verkabelung NACH dem Brennen. PORT B pb5 -> VTG (wenn der nicht Vcc ist resettet der Kleine permanent!!!) Reset ist low aktiv Thats it PORT B pb1 -> Taster eurer Wahl PORT B pb2 -> LED eurer Wahl
pb5 -> VTG könnt ihr vergessen. meiner hatte sich wohl verschluckt. Funktioniert mit oder ohne VTG an pb5
>Bei jedem Tastendruck auf switch 7 (sucht euch einen aus) wird LED 2
getoggelt. auch hier könnt ihr euch eine aussuchen.
das machts es bei mir nicht, verdammich!
erst das abklemmen von pb1 hilft weiter (isolieren)
mfg Fred
Bitte , Bitte Jürgen halbe eine stunde drüber nachgedacht, das liegt am bord (oder an mir, wie Junper sitzen) kanst du mir bitte die Jumperstellungen verraten? verwendest du die standard-einstellungen für mege8, mega32 ... bei mir liegt ein ein pegel (rückwärts vom Bord) von ca 5V am pb1 an!!! mfg Fred
board ist werkszustand jumper auf vtarget aref reset xtal1 oscsel rechts ... . .-. wenn ihr die schrift so lesen könnt (Aufdruck) bsel2 Betreibe das Board mit +12V grüße Jürgen
nachtrag tiny 12 in sockel sckt3400D1 Nachtrag: Bitte melde Dich erst wieder, wenn Dir Dein Name eingefallen ist. Mag es nicht 35 "Leute" ansprechen zu müssen Frohe Ostern, viel Spaß und STK500 funktioniert. Grüße Jürgen P.S. RTFM Hilft! Spruch aus meiner Jugend: "real programmers doesn´t read manuals" Sucht euch aus, was zutrifft;))
Ich frage mich, was das werden soll... Klar, ein Schalter für eine Tauchlampe... Also eine Betriebsart, der der der AVR ständig an der Batterie hängt und es keinen separaten Batterieschalter gibt. Dafür ist der Tiny12 recht ungeeignet, da sein Ruhestrom nicht zu verachten ist. Ein neuerer AVR wäre da besser geeignet. Abgesehen davon ist die Nutzung eines externen Interrupts für einen Taster alles andere als optimal. Taster prellen, Interrupts sind schnell. Der einzige vernünftige Grund, einen Taster an den Interrupt-Pin anzuschließen, ist das Aufwecken des AVRs aus dem "Tiefschlaf" (Power-Down-Mode). Dazu ist der Low-Level-Mode des ext. Interrupts geeignet. Aber eben nur zum Aufwecken. Schon in der ISR sollte dieser Interrupt deaktiviert werden und der Sleep-Mode auf IDLE umgeschaltet werden, um den Timertakt freizugeben und eine vernünftige Tastenabfrage mit Entprellung zu ermöglichen. Eine sehr effiziente Entprellroutine für eine Taste hat PeDa mal veröffentlicht, hier http://www.mikrocontroller.net/forum/read-1-140056.html#140946 wird nochmal darüber diskutiert. Auch die Software-PWM sollte man mit dem Timer realisieren. Das ermöglicht, dass der AVR zwischen den Timer-Interrupts in den Idle-Sleep gehen kann. Oder man nimmt gleich die Hardware-PWM, die die meisten AVRs implementiert haben. Das Datenblatt des entsprechenden AVRs verrät mehr darüber. ...
Hallo Hannes, das ist mir alles klar, ich dachte, 50µA schaden an der Batterie nicht, auch nicht auf Dauer. Es ging um Folgendes: das STK500 legt einen Pegel an den Pin an, mit dem ich es versuche, einen Interrupt auszulösen. (Int0)AVM hat vergessen, nach der ISP die Eingänge vom STK500 hochohmig zu schalten. Somit bekämpfen sich zwei Pegel (einmal der vom STK500 und der vom Tiny12). Habe das Problem jetzt durch Ersatz des Tiny12 durch einen Mega8 gelöst. Damit funktioniert es jetzt einwandfrei. Der Mega8 wiegt zwar ein klein wenig mehr, aber das spielt bei einer Tauchlampe wohl eher die untergeordnete Rolle. Der Preis bei diesen Stückzahlen wohl auch nicht (10-20 Stk.). mfg Bertram
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.