Hallo zusammen,
ich habe 2 Testprogramme für euch.
Das erste läuft wie erwartet. Hier wird TIMER0_OVF über TIFR abgefragt.
Beim zweiten wird in der ISR toggle=1 gesetzt, als Indikator für
eine ausgeführte ISR. Makefile ist in beiden Fällen gleich und setzt
atmega8 als uC.
Hardware Plattform STK500.
Meine Rechereche hat einen sehr ähnlichen Fall herausgebracht.
Beitrag "atmega8515 auf STK 500: Timer funtkionieren nicht"
Leider wurde dem Fragesteller dort nicht geholfen.
Alle Quellen nachfolgend gelistet.
Zuerst Makefile (Cygwin Umgebung)
Nachtrag:
$(objcopy) -j .text -j .data -I binary -O ihex main.elf main.hex
ist das so korrekt?
Was mich nocht etwas verwundert ist ...
1
$ avr-objdump.exe -j .data -d main.elf
2
3
main.elf: file format elf32-avr
müsste nicht die volatile Variable toggle in der Sektion .data
abgelegt sein? Oder "löst" Compiler die volatile Anforderung damit,
dass er ihnen ein Register zuweist.
Wie erkennst du, ob was passiert? Zwischen PORTB=0x03 und PORTB=0x00
vergehen nur 32.8ms. Und dann passiert laut Programmcode im 2. Beispiel
nix mehr.
Wenn du zwei LEDs hast, schalte nur eine regelmä0ig und lass die andere
immer an. Wenn die eine LED sehr schnell geschaltet wird (alle 32ms ist
schnell!), sollte man wenigstens einen Helligkeitsunterschied sehen.
IN deiner 'nicht funktionierenden Version':
Wo wird toggle wieder auf 0 zurück gesetzt?
Du setzt toggle mit dem ersten AUfruf der ISR auf 1, setzt es aber nie
weider zurück.
Daniel -------- schrieb:> ISR(TIMER0_OVF_vect) {> TCNT0 = 0;> toggle = 1;> }
Und dann brems' das Ding mal aus:
volatile unsigned char nT = 0;
SR(TIMER0_OVF_vect)
{
nT++;
if (!nT)
{
TCNT0 = 0;
toggle = 1;
}
}
Und siehe Toby.
Dann blinkt das auch für dich sichtbar.
mfg.
Krapao schrieb:> Wie erkennst du, ob was passiert?
vielleicht hätte ich das, was ich beobachte deutlicher zum Ausdruck
bringen sollen
Vorbereitung => setze die 2 externen leds mit PORTB = 0x03; (sie
leuchten)
Erwartung => ich erwarte, dass ISR toggle=1 setzt, sodass dann in main
if(toggle){PORTB=0x00;} die leds abschaltet.
Beobachtung => die externen leds werden nicht abgeschaltet. (sie
leuchten)
Schlussfolgerung => ISR wird nicht ausgeführt.
---
toggle ist irreführend bezeichnet, ihr habt da recht.
Beim STK500 sind die LEDs active-low geschaltet. NAch dem Reset sind die
LEDs aus, da der Pourt Eingang ist. Beim Datenrichtungssetzen sind die
LEDs ein. Dein erstes Kommando schaltet die LEDs aus. Dann beim Timer
IRQ schaltest du die LEDs ein. Weil zwischen den ersten Kommandos der
AVR affenartig schnell ist, siehst du die einzelnen LED-Zustände nicht.
spess53 schrieb:> Kommt darauf an, wie die LEDs angeschlossen sind.>> MfG Spess
logo :)
masse --|<|-- PORTB1
masse --|<|-- PORTB2
kein Vorwiderstand, lasse den AVR die leds mit 20mA speisen :)
BTW: wieviel mA kann ein Port (in dem Fall zufälligerweise PORTB)
insgesamt treiben? Das ein Pin 20mA heisst, bedeutet ja noch
lange nicht, dass ein Port mit 8 Pins 160mA treiben kann.
Oder im Fall von AVR schon? Hab leider dazu vergeblich im Netz gesucht.
>> masse --|<|-- PORTB2>> kein Vorwiderstand, lasse den AVR die leds mit 20mA speisen :)> jepp, mein setup ist aber anders
Freu dich dran so lange es hält. Nix ist ewig ;-(
Stefan Ernst schrieb:> $(gcc) -o main.elf main.o> Dein Code wird für den falschen Controller gelinkt (-mmcu fehlt).
jetzt habe ich Makefile abgeändert, aber keine Wirkung.
Gehört -mmcu Option in jedem Fall dazu, wenn man aus .o die .elf Datei
erzeugt?
um ein Paar zusätzliche Einsichten zu bekommen, habe ich mein Code
leicht erweitert.
als feedback, dass main normal abgearbeitet wird, habe ich
STK500 eigene leds mit in spiel reingebracht.
Das interessante ist, wenn ich sei() herauskommentiere!, dann
wechseln die STK500 leds ihren Zustand (0xAA -> 0x55 -> 0xAA ..)
Wenn sei() nicht herauskommentiert ist, verharren die STK500 leds
im 0x55 Zustand.
hmm, irgendwas stinkt da. Das ist nämlich exakt das, was im Thread
Beitrag "atmega8515 auf STK 500: Timer funtkionieren nicht"
beschrieben wird.
Daniel -------- schrieb:> jetzt habe ich Makefile abgeändert, aber keine Wirkung.
Dann mache doch mal
1
avr-objdump -d -h main.elf
und poste den Output.
Daniel -------- schrieb:> Gehört -mmcu Option in jedem Fall dazu, wenn man aus .o die .elf Datei> erzeugt?
Ja, zwingend.
Übrigens:
1
cflags = -Wall -O2 -Os
Was denn nun, 2 oder s?
(dürfte aber nicht die Ursache deines Problems sein)
Daniel -------- schrieb:> hmm, irgendwas stinkt da. Das ist nämlich exakt das, was im Thread> Beitrag "atmega8515 auf STK 500: Timer funtkionieren nicht"> beschrieben wird.
Und dort fehlt übrigens auch ein -mmcu.
Stefan Ernst schrieb:>> hmm, irgendwas stinkt da. Das ist nämlich exakt das, was im Thread>> Beitrag "atmega8515 auf STK 500: Timer funtkionieren nicht">> beschrieben wird.>> Und dort fehlt übrigens auch ein -mmcu.
Makefile ist nachgezogen, sieht jetzt so aus
Stefan Ernst schrieb:> Dann mache doch mal> avr-objdump -d -h main.elf
ich bin kein tiefer Kenner des Assemblers
mir scheinen alle Sektions vertreten zu sein.
Interrupt 0x09 steht auch in der Tabelle.
Hallo zusammen!
Wie Daniel habe ich das Selbe Problem, allerdings mit Bascom (ich hoffe
jemand kann nebst C auch Bascom lesen)
Bei mir will der Timer2 (übrigens das gleiche Problem auch mit Timer0)
nicht hochzählen.
Am Besten ist es wenn ich den Code poste:
$regfile "m48def.dat"
$crystal = 10000000
$baud = 9600
Config Portb = Output
Dim A As Integer 'Winkel
Alpha
Dim B As Integer 'Sin- Wert
von Alpha
Dim C As Integer 'Ein- Zeit
der PWM (indirekte Spannung)
Dim D As Integer 'Winkel
Dim E As Integer
Dim W As Byte
'PWM- Timer
====================================================================
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B
Pwm = Clear Up , Prescale = 256
Enable Timer1
'Interrupttimer
================================================================
Config Timer2 = Timer , Prescale = 1
On Timer2 Tim2isr
Enable Interrupts
Enable Timer2
'=======================================================================
========
Start Timer2
A = 0
B = 0
C = 1
D = 235 / 100
sbi portb,3
cbi portb,4
Pwm1a = C
Start Timer2
Do
W = Timer2
If W > 2 Then
sbi portb,5
End If
Loop
Tim2isr:
'interruptroutine f¸r timer0
A = A + D
'B = Sin(a) 'B =
Round(b)
'B = Rad2deg(b)
If A => 179 Then
A = 0
Toggle Pinb.3
Toggle Pinb.4
Else
End If
C = B * 254 'Ein-Zeit =
sinAlpha * Radius
Pwm1a = C
Return
End 'end program
Kann mir ja vielleicht jemand helfen, bzw, sagen was nicht richtig ist?
Danke und Gruss Andi
Andi K. schrieb:> Wie Daniel habe ich das Selbe Problem, allerdings mit Bascom (ich hoffe> jemand kann nebst C auch Bascom lesen)
Mach' Dir 'nen eigenen Thraed auf, statt einen zu kapern.
Daniel -------- schrieb:> ich bin kein tiefer Kenner des Assemblers> mir scheinen alle Sektions vertreten zu sein.> Interrupt 0x09 steht auch in der Tabelle.
Ich kann kein Problem entdecken.
Zum Flashen benutzt du auch das Makefile?
Andi K. schrieb:
>> Wie Daniel habe ich das Selbe Problem, allerdings mit Bascom (ich hoffe>> jemand kann nebst C auch Bascom lesen)>Mach' Dir 'nen eigenen Thraed auf, statt einen zu kapern.
Naja ich habe gedacht es wäre leichter zwei Leuten in einem Thraed zu
helfen, als in zwei Thraed's... Aber gut, mache ich hald einen neuen
auf.
Daniel -------- schrieb:> vielleicht kann jemand mal bei sich ausprobieren
Mit AVR-Studio4 und dem angehängten Makefile lässt sich das erst gar
nicht compilieren.
> make: *** No rule to make target `main.c', needed by `main'. Stop.
mit ordentlichem makefile compiliert der Code. Wobei der aber sinnlos
ist, da "toggle" nicht zurückgesetzt wird.
löst das Rätsel. Das Eingabeformat ist wohl nicht "binary".
@MWS
ich bevorzuge selbstgeschriebene makefiles
die sind schmächtig und ich verstehe was sie tun.
Bis solche harten Nüsse hochkommen :)
Andererseits lernt man es an denen mit der Zeit.
peace
Daniel -------- schrieb:> ich bevorzuge selbstgeschriebene makefiles> die sind schmächtig und ich verstehe was sie tun.
Ob die nun schmächtig sind, wird wohl eher wurscht sein. Wichtig ist,
dass es läuft und wenn ein automatisch generiertes makefile dafür sorgt,
dass das selbst zusammengeschraubte schließlich funktioniert, umso
besser.