Forum: Mikrocontroller und Digitale Elektronik AT91SAM7A2 Simple Timer Problem mit Interrupt


von Bri (Gast)


Lesenswert?

So langsam hasse ich den AT91SAM7A2. Ich möchte eigentlich nur den 
simple timer benutzen, um eine LED blinken zu lassen und es geht nicht.

Also die Interrupts funktionieren. Ich habe zum Ausprobieren den 
externen Interrupt IRQ1 programmiert. Der ist mit einem Button 
verbunden. Den kann ich mehrmals drücken und es gibt keine Probleme, die 
LED geht an und aus. Nun versuche ich das gleiche mit dem simple tiemr 
zu machen, streng nach Datenblatt:
1
  // configure interrupt
2
  
3
  // disable interrupt
4
  GIC->IDCR = GIC_ST0;
5
  
6
  // set source mode
7
  GIC->SMR[GIC_IDX_ST0] = 0;
8
  
9
  // set interrupt handler
10
  GIC->SVR[GIC_IDX_ST0] = (AT91_REG)ISR_Timer;
11
  
12
  // clear interrupt
13
  GIC->ICCR = GIC_ST0;
14
  
15
  // enable timer
16
  ST0->ECR = ST_ST;
17
  
18
  // software reset to initialize the timer
19
  ST0->CR = ST_CR_SWRST;
20
  
21
  // wait a little bit
22
  for (idx = 0; idx < 16; idx++)
23
    asm volatile ("NOP");
24
  
25
  // adjust timer: 1 tick per second
26
  ST0->PR0 = ST_PR_PRESCALAR(2) | ST_PR_AUTOREL | ST_PR_SYSCAL(74);
27
  ST0->CT0 = 50000;
28
  
29
  // enable channel end interrupt 
30
  ST0->IER = ST_IR_CHEND0;
31
  
32
  // enable interrupt
33
  GIC->IECR = GIC_ST0;
34
  
35
  // start timer
36
  ST0->CR = ST_CR_CHEN0;

In der Interrupt-Routine lösche ich, wie im Datenblatt beschrieben, das 
Interrupt Statusbit:
1
  // acknowledge interrupt by clearing status bit
2
  ST0->CSR = ST_CSR_CHEND0;

Aber trotzdem wird die Interrupt-Routine nur einmal aufgerufen, dann nie 
wieder. Wie schon gesagt, mit dem anderen Interrupt funktioniert es, mit 
dem simple timer nicht. Ich hab mir schon die Counter Register des Timer 
angeschaut, die werden ordnungsgemäß runter gezählt. Aber der Interrupt 
kommt nur einmal. Hat jemand eine Idee? (Falls nicht, dann werde ich die 
anderen Timer verwenden.)

von Bri (Gast)


Lesenswert?

AAAAAHHHHHRRRGGHHHHH!!!!!!!!!!!!!!!!

Ich such hier seit Stunden meinen Fehler und diese Volldeppen haben 
einen Fehler im Datenblatt!!!!!!!!!

Also, das Bit im Register ST_CSR für channel 0 ist nicht das Bit 1 
sondern das Bit 0, wie zum Beispiel bei dem Interrupt Register ST_IDR 
oder ST_IMR!

von Niko (Gast)


Lesenswert?

Hallo Bri,

ich habe ihre post über sam7-la2 gesehen! Können Sie mir helfen das 
board programieren bekommen?

Ich kann nicht zu flash schreiben. Ich habe mit Ihre cfg datei versucht 
aber kein erfolg.

Bitte senden Sie mich ein email: bauer.niko at_ gmail _dot com

schon mal besten dank

Niko.

von Bri (Gast)


Lesenswert?

Das ganze ist ziemlich kompliziert. Es hängt davon ab, welche Software 
bereits auf dem Board installiert ist. Die Software initialisiert beim 
Start den AMC, den Speichercontroller, und macht danach ein remap der 
Adressen. Das heißt das Flash liegt dann nicht mehr an Adresse 0 sondern 
z.B. bei 0x40000000. Das remap wird aber nicht sofort ausgeführt, 
sondern erst nachdem der Startup Code zum Teil ausgeführt wurde. An 
welcher Adresse der Flash liegt, hängt also auch noch davon ab, an 
welcher Stelle man das Programm mit dem JTAG Interface unterbricht. 
Aktuell habe ich es so gemacht, dass ich erstmal einen Reset über JTAG 
mache, dann warte ich eine Sekunde, damit das remap gemacht wird, dann 
halte ich den Prozessor an. Jetzt kann ich den Flash an Adresse 
0x40000000 programmieren. Es ist auch sehr wichtig das man eine working 
area vorgibt, sonst dauert das flashen sehr lange. Da bei meinem 
Startupcode auch schon der RAM initialisiert ist, kann ich meine working 
area auf die Adresse 0x40400000 festlegen.

von Niko (Gast)


Lesenswert?

Hi.

Wir haben auf dem Board immer noch die von Olimex mitgelieferte 
Original-Software zum Boardtest drauf (ändern konnten wir das bis jetzt 
ja noch nicht). Zum Flashen nehmen wir den usbprog im openocd-Mode oder 
den Wiggler, bis jetzt haben wir da noch keinerlei Unterschied 
feststellen können.

Wir kommen auch mit dem letzten Hinweis irgendwie nicht weiter. Wenn wir 
das skript wie von ihnen beschrieben ausführen, bekommen wir eine 
Fehlermeldung, wenn der Watchdog abgeschaltet werden soll:

> mww 0xffa00068 0
error: access caused data abort, system possibly corrupted
>

Dieser Fehler tritt nur im Supervisor-Mode auf. Wenn wir durch ein 
"halt" in den Abort Mode wechseln, gibt es beim Schreiben dieses 
Registers auch keine Probleme mehr.

Aufs Flash zuzugreifen funktioniert nie. Egal in welchem Zustand, es 
kommt immer diese Fehlermeldung (auch wenn eine working area 
eingerichtet ist):
> flash probe 0
probing failed for flash bank '#0' at 0x40000000
>

OpenOCD spuckt dann das aus:
Debug:   arm7_9_common.c:1779 arm7_9_read_memory(): address: 0x40000024, 
size: 0x00000002, count: 0x00000001
Debug:   embeddedice.c:220 embeddedice_read_reg_w_check(): 1
Debug:   cfi.c:1692 cfi_probe(): CFI qry returned: 0x04 0xffffff98 
0xffffffd3

Scheint also noch ein Problem damit zu sein, dass das CFI nicht korrekt 
angesprochen wird, oder im AMC noch nicht richtig gesetzt ist. Aber der 
Wert sieht richtig aus:
> mdw 0xffe00000 16
0xffe00000: 40003ebd 404030a9 404030a9 58000000 60000000 68000000 
70000000 78000000
0xffe00020: 00000001 00000004 00000000 00000000 00000000 00000000 
00000000 00000000
>

Mit den Timings haben wir schon alle möglichen Varianten durchgespielt, 
auch schon in einem Brute-Force Ansatz alle möglichen einstellen zu 
lassen ... egal wie, kein Erfolg.

Kann das jetzt noch vielleicht am OpenOCD liegen? Welche Version 
verwenden Sie? (wir haben die Windows-Version von 
http://www.ixbat.de/index.php?page_id=177)
Können Sie uns ihre openocd.cfg und ihr reset-Skript zukommen lassen?

Danke schon mal im Voraus!

PS: Sorry, dass wir hier vom Thema des Threads abweichen ... wir konnten 
sie anders nicht erreichen.

von Bri (Gast)


Angehängte Dateien:

Lesenswert?

Das ist meine Konfigurationsdatei. Das Flash wird bei mir als non cfi 
flash erkannt und korrekt programmiert. (flash probe)
Ein reset script habe ich nicht verwendet. Das openocd hat mir einige 
Probleme bereitet, was aber wohl größtenteils daran liegt, dass ich mir 
einen Parallelport JTAG Adapter gebaut habe. Die aktuelle Version hat 
Probleme gemacht, die Version vom 05.08.2008 funktioniert.

von Bri (Gast)


Angehängte Dateien:

Lesenswert?

Zum Programmieren habe ich mir dieses script geschrieben, das ich in 
openocd aufrufe. Folgendermaßen gehe ich vor:

1. reset
2. kurz warten
3. halt
4. script prog.scr

von Chris (Gast)


Lesenswert?

Hi, ich habe auch das SAM7-LA2... g
Mal ne allgemeine Frage zu der ISR. Wie schreibe ich die in C? Also was 
steht vor und hinter der Code-Zeile von Bris:
1
  // acknowledge interrupt by clearing status bit
2
  ST0->CSR = ST_CSR_CHEND0;

von Chris (Gast)


Angehängte Dateien:

Lesenswert?

zusatzinfo: ich compiliere das ganze mit "arm-elf-gcc". (siehe makefile 
im Anhang)

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.