Forum: Mikrocontroller und Digitale Elektronik Tiny12 ext interupt


von Fred (Gast)


Lesenswert?

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

von Fred (Gast)


Lesenswert?

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

von Jürgen K. (jk2010)


Lesenswert?

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

von Fred (Gast)


Lesenswert?

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

von Ede (Gast)


Lesenswert?

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

von Jürgen K. (jk2010)


Lesenswert?

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

von Ede (Gast)


Lesenswert?

Danke Jürgen,

rel einfach; es gibt keine
mfg fred

von Ede (Gast)


Lesenswert?

bin jetzt ca 0,5h offline, bis ich zuhause bin

Dnke Fred

von Topic-Verfolger (Gast)


Lesenswert?

Fred = Ede = Malte ???

Beitrag "Bitte um Hilfe STK500"

von Fred (Gast)


Lesenswert?

nö

Fred

von Jürgen K. (jk2010)


Lesenswert?

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

von Jürgen K. (jk2010)


Lesenswert?

pb5 -> VTG könnt ihr vergessen. meiner hatte sich wohl verschluckt. 
Funktioniert mit oder ohne VTG an pb5

von Ede (Gast)


Lesenswert?

>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

von Sike (Gast)


Lesenswert?

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

von Jürgen K. (jk2010)


Lesenswert?

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

von Jürgen K. (jk2010)


Lesenswert?

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;))

von Hannes L. (hannes)


Lesenswert?

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.

...

von Otto (Gast)


Lesenswert?

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

von Mitleser (Gast)


Lesenswert?


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
Noch kein Account? Hier anmelden.