Forum: Mikrocontroller und Digitale Elektronik Blick's mit dem Timer nicht :(


von Ramones (Gast)


Lesenswert?

Mayday, PanPan, Hilde und SOS!!!!!!

Ich stehe bei’m  Timer/Counter total auf dem Schlauch!! (ATmega8)
Berechnen und so ist alles kein Problem, mir ist auch Klar wie er zu 
konfigurieren ist. Aber ich kann mit dem Timer nicht so arbeiten wie ich 
das möchte!!!

Ich möchte, wenn Taster1 (Interrupt) gedrückt wurde, dass eine LED an 
Port-B 5x blinkt.
Klingt ja soweit nicht schwierig! Dachte ich!!!!! Ich bekomme den Timer 
soweit hin, dass er in entsprechendem Tempo die LED blinken lässt.
Aber egal was ich versuche dem Timer ist der Taster egal!?!

Ich vermute, dass der Timer nicht via Interrupt genutzt werden 
soll??!!??
Habe schon massenhaft gelesen und gesucht aber nichts gefunden oder 
wahrscheinlich nur nicht begriffen :)

Kann mit bitte, bitte jemand verständlich erklären wie ich den Timer als 
Counter steuern kann!!

Untenstehend mein Code, soweit wie er funktioniert.

Danke
Ramon
1
.include        "AVR.H"
2
;----------------------------------------------------------------------
3
begin:
4
    rjmp    main         ; RESET External Pin, Power-on Reset,
5
    rjmp    Tast1         ; INT0 External Interrupt Request 0
6
    reti                       ; INT1 External Interrupt Request 1
7
    reti                       ; TIMER2 COMP Timer/Counter2 Compare Match
8
    reti                       ; TIMER2 OVF Timer/Counter2 Overflow
9
    reti                       ; TIMER1 CAPT Timer/Counter1 Capture Event
10
    reti                       ; TIMER1 COMPA Timer/Counter1 Compare Match A
11
    reti                       ; TIMER1 COMPB Timer/Counter1 Compare Match B
12
    reti                       ; TIMER1 OVF Timer/Counter1 Overflow
13
    rjmp    TC0           ; TIMER0 OVF Timer/Counter0 Overflow
14
    reti                       ; SPI, STC Serial Transfer Complete
15
    reti                       ; USART, RXC USART, Rx Complete
16
    reti                       ; USART, UDRE USART Data Register Empty
17
    reti                       ; USART, TXC USART, Tx Complete
18
    reti                       ; ADC ADC Conversion Complete
19
    reti                       ; EE_RDY EEPROM Ready
20
    reti                       ; ANA_COMP Analog Comparator
21
    reti                       ; TWI 2-wire Serial Interface
22
    reti                       ; SPM_RDY Store Program Memory Ready
23
;---------------------------------------------------------------------
24
main:
25
    ldi r16,hi8(RAMEND)                ; Main program start
26
    out SPH,r16                        ; Set Stack Pointer to top of RAM
27
    ldi r16,lo8(RAMEND)
28
    out SPL,r16
29
    
30
    cbi DDRC,2    ; Eingang D.2 (Taster1)
31
    sbi PORTD,2    ; PullUp D.2
32
    
33
    sbi DDRB,1    ; Ausgang LED
34
    
35
    
36
    ldi r16,0b00000101  ; Mask. Timer-Int
37
    out TCCR0,r16    ;
38
    ldi r16,0b00000001  ; Timer Konfig.
39
    out TIMSK,r16    ; 
40
    
41
    ldi r16,0            ; Startwert
42
    sei
43
    
44
;------------------------------------------------------------------------------
45
mainloop:  
46
    
47
    rjmp  mainloop
48
;------------------------------------------------------------------------------
49
TC0:            ; Counter0
50
  
51
  com r16
52
  out PORTB,r16
53
  ldi r17,95
54
  out TCNT0,r17  
55
reti
56
;------------------------------------------------------------------------------  
57
Tast1:      ; Taster1
58
59
60
reti

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Ramones schrieb:
> Aber egal was ich versuche dem Timer ist der Taster egal!?!

Ohne Code wird das auch so bleiben.
Woher soll der arme AVR denn wissen, was Du beim Tastendruck gemacht 
haben willst, wenn Du es ihm nirgends sagst. Hellsehen kann er nicht.

von c-hater (Gast)


Lesenswert?

Ramones schrieb:

> .include        "AVR.H"

Huch?! Was ist das denn für ein Assembler?

>     cbi DDRC,2    ; Eingang D.2 (Taster1)
>     sbi PORTD,2    ; PullUp D.2

Du mußt schon bei einem Port bleiben, wenn das funktionieren soll.

Außerdem fehlt die Initialisierung für den INT0, der wird also niemals 
ausgelöst werden. Und wenn das durch irgendein Wunder doch passieren 
sollte...

> Tast1:      ; Taster1
>
> reti

...würde es trotzdem nix bewirken, weil die ISR leer ist.

>     ldi r16,0b00000101  ; Mask. Timer-Int
>     out TCCR0,r16    ;
>     ldi r16,0b00000001  ; Timer Konfig.
>     out TIMSK,r16    ;

Das ist unleserlich, zumal du uns nicht einmal verraten hast, um welchen 
AVR es eigentlich geht.


> TC0:            ; Counter0
>
>   com r16
>   out PORTB,r16
>   ldi r17,95
>   out TCNT0,r17
> reti

Das ist wenig elegant. Wolltest du wirklich den kompletten PortB wackeln 
lassen oder nur ein Pin des Ports?

Außerdem ist es gewöhnlich Unsinn, das Zählregister eines Timers in 
einer ISR neu zu laden. Das kann der Timer selber sehr viel besser. 
Siehe CTC-Modus.

Last, but not least: dein Programm enthält nix, was bis 5 zählt. Selbst 
wenn du den INT0 funktionsfähig gebacken bekommst, würde es trotzdem 
niemals so funktionieren, wie du lt. deiner Funktionsbeschreibung 
wolltest.

von Ramones (Gast)


Lesenswert?

Hey ist ja echt nett hier!!

Habe nicht verraten um was für einen AVR es sich handelt!?
Sorry!! Ich dachte Spezialisten wie Ihr können mit der Bezeichnung 
„ATmega8“ was anfangen.
Also Es handelt sich um einen Mikrocontroler der Firma Atmel Typ: mega8 
(ATmega8)

Eingangsport ist natürlich D.2 nicht C.2 (vertippt)

INT0 wird auch initialisiert!!!
Was soll da unleserlich sein??

Habe den Code für die „bis fünf Zählung“ absichtlich leer gelassen da ja 
meine Frage oder
Vermutung war, dass der Timer nicht via Interrupt genutzt werden soll 
!!??

Elegant oder nicht, sinnvoll oder nicht war doch auch gar nicht die 
Frage!!

von c-hater (Gast)


Lesenswert?

Ramones schrieb:

> INT0 wird auch initialisiert!!!

Wo genau?

von Ramon L. (ramones)


Lesenswert?

c-hater schrieb:
> Ramones schrieb:
>
>> INT0 wird auch initialisiert!!!
>
> Wo genau?

Kennst Du am ATmega8 den PortD.2??

von c-hater (Gast)


Lesenswert?

Ramon Lehmann schrieb:
> c-hater schrieb:
>> Ramones schrieb:
>>
>>> INT0 wird auch initialisiert!!!
>>
>> Wo genau?
>
> Kennst Du am ATmega8 den PortD.2??

Sicher.

Aber damit der den INT0 auslösen kann, muß er entsprechend initialisiert 
werden.

Es genügt nicht, ihn als Eingang zu konfigurieren und seinen Pullup 
einzuschalten. Damit wird er einfach nur zu einem Eingang mit Pullup, 
aber noch nicht zu einer Interruptquelle.

Siehe Datenblatt->externe Interrupts.

von Ramon L. (ramones)


Lesenswert?

das ist mir klar!!

fünfte Zeile im Code, dort wird der Int0 Aktiviert.
In nutze Sisy zum proggen.

von c-hater (Gast)


Lesenswert?

Ramon Lehmann schrieb:
> das ist mir klar!!

Nein, ganz offensichtlich ist dir das nicht klar.

> fünfte Zeile im Code, dort wird der Int0 Aktiviert.

Das soll dann wohl diese sein:

    cbi DDRC,2    ; Eingang D.2 (Taster1)

Nein, die konfiguriert nur den Pin als Eingang, das ist alles, was diese 
Zeile tut. Steht eigentlich auch so in deinem eigenen (?) Kommentar.

> In nutze Sisy zum proggen.

Das ändert daran auch nichts.

von T.roll (Gast)


Lesenswert?

c-hater schrieb:
> Das soll dann wohl diese sein:
>
>     cbi DDRC,2    ; Eingang D.2 (Taster1)

Das mit dem Zählen üben wir aber nochmal.

Das ist die 5. Zeile der main:

Die 5. Zeile des Programms ist:
1
rjmp    Tast1         ; INT0 External Interrupt Request 0

von Ramon L. (ramones)


Lesenswert?

>> fünfte Zeile im Code, dort wird der Int0 Aktiviert.
>
> Das soll dann wohl diese sein:
>
>     cbi DDRC,2    ; Eingang D.2 (Taster1)

Du solltest mal zählen lernen!
was bei dir fünf ist ist bei mir 30!!!

von c-hater (Gast)


Lesenswert?

T.roll schrieb:

> Die 5. Zeile des Programms ist:
> rjmp    Tast1         ; INT0 External Interrupt Request 0

Auch eine Sprunganweisung in einem Interruptvektor schaltet keinen 
Interrupt frei.

von Ramon L. (ramones)


Lesenswert?

@c-hater
t.roll hat's erkannt.
und ich hatte auch erwähnt, dass ich mit Sisy progge!!!! Dort reicht es 
aus das reti zu ersetzen!!!!!!

@c-hater bitte nicht weiter antworten!!! ich möchte mich hier lieber mit 
den Timern beschäftigen, und nicht damit was du für sinnvoll, elegant 
oder sons was hältst.
danke dir aber für deine bemühungen.

von c-hater (Gast)


Lesenswert?

Ramon Lehmann schrieb:

> und ich hatte auch erwähnt, dass ich mit Sisy progge!!!! Dort reicht es
> aus das reti zu ersetzen!!!!!!

Bestimmt nicht. Den Timerinterrupt muß man ja offensichtlich auch "von 
Hand" konfigurieren, warum sollte das beim Int0 anders sein?

> Ich möchte mich hier lieber mit
> den Timern beschäftigen

Ich dachte, du willst den Interrupt für den Taster zum Laufen bekommen? 
Der hat mit dem Timer überhaupt nichts zu schaffen.

von Herr M. (herrmueller)


Lesenswert?

Wie initialisiert denn dein Sisy den INT0?

Low Level an PinD,2 löst IR aus?
Level Änderung an PinD,2 löst IR aus?
Fallende Flanke an PinD,2 löst IR aus?
Steigende Flanke an PinD,2 löst IR aus?

Wird das External Interrupt Request Enable Flag gesetzt,damit der IR 
Vektor angesprungen wird oder muss man das External Interrupt Flag 0 
extra abfragen?

Wenn das Sisy alles automatisch macht, ist man sehr eingeschränkt und 
sollte wissen, was gemacht wurde - sehr unwahrscheinlich!!!!!!!!!!!!!!

(Die Ausrufezeichen hab ich von dir geklaut, ich hoffe, du hast nun 
keine mehr)

: Bearbeitet durch User
von Andreas H. (ahz)


Lesenswert?

Ramon Lehmann schrieb:
> und ich hatte auch erwähnt, dass ich mit Sisy progge!!!! Dort reicht es
> aus das reti zu ersetzen!!!!!!

<irony>
Wow, was ist das den für ein schicker Progger ?

Setzt automatisch das MCUCR und das GICR ?  Und weiss auch noch 
automatisch ob Du Edge/Level triggern willst und auf welchen 
Level/Flanke.

Beeindruckend^^

Oder hat c-hater vielleicht doch recht und Du musst das selber machen ?
</irony>

Sagen Dir die Register MCUCR und GICR irgendwas ?

bored

von Andreas H. (ahz)


Lesenswert?

c-hater schrieb:
> Bestimmt nicht. Den Timerinterrupt muß man ja offensichtlich auch "von
> Hand" konfigurieren, warum sollte das beim Int0 anders sein?

Herr Mueller schrieb:
> Wenn das Sisy alles automatisch macht, ist man sehr eingeschränkt und
> sollte wissen, was gemacht wurde - sehr unwahrscheinlich!!!!!!!!!!!!!!

Macht Sisy nicht.

Alexander Huwald (?), der Autor von Sisy, hatte vor ein paar Jahren in 
der ELV mal ein paar Artikel über Programmierung mit Sisy geschrieben.

Hab grad mal nachgeschaut:
http://www.elv-downloads.de/service/manuals_hw/67696_myavr_journalbericht.pdf

Und ER hat die Inits im Code drin ;-)

Grüße
Andreas

von Peter D. (peda)


Lesenswert?

Beim OP scheint ein erheblichen Mißverständnis über die Arbeitsweise von 
MCs zu bestehen.
Dabei ist es ganz einfach so:
Was im Code nicht drinsteht, kann auch nicht ausgeführt werden.
Insbesondere leere Interrupthandler sind vollkommen sinnfrei (außer im 
Sleepmode).

von Justus S. (jussa)


Lesenswert?

Peter Dannegger schrieb:
> Beim OP scheint ein erheblichen Mißverständnis über die Arbeitsweise von
> MCs zu bestehen.

vor allem aber bestehen erhebliche Mißverständnisse über das angemessene 
Verhalten in Foren...

von Georg G. (df2au)


Lesenswert?

Justus Skorps schrieb:
> das angemessene Verhalten in Foren...

wobei dieses Forum wirklich etwas ähmmm speziell ist.

von c-hater (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Beim OP scheint ein erheblichen Mißverständnis über die
> Arbeitsweise von
> MCs zu bestehen.

Das kann man wohl kaum bestreiten ;o)

Außerdem scheint er auch noch ein Problem beim Gebrauch von Satzzeichen 
in seiner Muttersprache zu haben. Das läßt nicht hoffen, daß er jemals 
eine Fremdsprache lernen kann. Und sei es auch nur eine syntaktisch so 
einfache und durch und durch logische wie Assembler...

> Dabei ist es ganz einfach so:
> Was im Code nicht drinsteht, kann auch nicht ausgeführt werden.

Das allerdings ist nur bedingt korrekt. Das hängt vom Abstraktionsgrad 
der verwendeten Programmiersprache ab. Hier wird allerdings Assembler 
verwendet, wo nichts (oder nahezu nichts) abstrahiert wird und insofern 
hast du natürlich vollkommen recht. Was nicht da steht, wird hier im 
Allgemeinen auch nicht passieren.

> Insbesondere leere Interrupthandler sind vollkommen sinnfrei (außer im
> Sleepmode).

Nö, das stimmt nicht unbedingt. Ich habe zumindest ein Projekt, in dem 
es eine "leere" ISR auch für den ganz normalen Betrieb gibt (bestehend 
aus einem reti auf dem Interruptvektor).
Deren einzige Aufgabe ist das Zurücksetzen des auslösenden 
Interruptflags mit einer gewissen Verzögerung (min. 4 Takte). Das 
Gesamtwerk funktioniert wie geplant, würde das aber nicht tun ohne eben 
diesen Mechanismus.

Hört sich etwas schräg an, war aber tatsächlich im konkreten Fall die 
effizenteste Implementierung des Gesamtproblems. OK, ich gebe gerne zu, 
daß sowas nur in sehr speziellen Fällen sinnvoll ist. Aber auch solche 
seltenen Sonderfälle zeigen halt, daß man sich mit verallgemeinernden 
Aussagen wie "leere Interrupthandler sind vollkommen sinnfrei" etwas 
zurückhalten sollte. Immer relativieren. Jedenfalls solange das Problem 
nicht im ganzen Umfang mit allen Eckdaten bekannt ist.

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.