Forum: Mikrocontroller und Digitale Elektronik AVR Bootloader in C - eine einfache Anleitung für XMEGA adaptieren


von Alexander H. (ill_son)


Lesenswert?

Hallo,

ich versuche gerade, "AVR Bootloader in C - eine einfache Anleitung" für 
einen ATXMEGA128A Rev. H zu adaptieren. Ich bin noch ganz am Anfang, 
habe aber schon die ersten Stolpersteine.
Die Fleury-Lib habe ich angepasst. Ich habe das ganze mal im Debug-Mode 
durchgetackert. Bis
1
uart_puts("Hallo hier ist der Bootloader\n\r");
 läuft alles. Wenn ich dann in der uart_putc
1
 USARTF0_CTRLA |= USART_DREINTLVL_LO_gc;
setze, gibt es irgendwie eine Art Reset, aber nur einmal. Das merke ich 
daran, das 0x55 ('U') vom Programmanfang zweimal gesendet wird. Auch 
funktioniert die UART-Ausgabe per Interrupt nicht.

Zusatzinfo: Atmel Studio 6, Fuse BOOTRST gesetzt (0), 
Projekteinstellungen->AVR/GNU Linker->Miscellanious->  -Ttext=0x10000

folgender Code:
1
int main()
2
{
3
    unsigned int  c=0;               /* Empfangenes Zeichen + Statuscode */
4
    unsigned char  temp,              /* Variable */
5
                    flag=1,            /* Flag zum steuern der Endlosschleife */
6
          p_mode=0;     /* Flag zum steuern des Programmiermodus */
7
    
8
  void (*start)( void ) = 0x0000;        /* Funktionspointer auf 0x0000 */
9
 
10
    /* Interrupt Vektoren verbiegen */
11
 
12
  SYS_CLK_Init();
13
    
14
  PORTH.DIRSET = PIN4_bm;  //Periphery on
15
  PORTH.OUTSET = PIN4_bm;
16
    
17
  PORTJ.DIRSET = PIN2_bm | PIN1_bm | PIN0_bm;
18
  PORTJ.OUTTGL = PIN2_bm | PIN1_bm | PIN0_bm;
19
  
20
  PORTF.DIRSET = PIN3_bm;  // PORTF3 (TX) as output
21
  PORTF.DIRCLR = PIN2_bm;  // PORTF2 (RX) as input
22
    
23
  uart_init(); 
24
  USARTF0_DATA = 0x55;
25
    
26
  char sregtemp = SREG;
27
  cli();
28
    
29
  PMIC.CTRL |= PMIC_LOLVLEN_bm;   // Enable PMIC interrupt levels
30
  
31
  temp = PMIC.CTRL | PMIC_IVSEL_bm;
32
  CCP = CCP_IOREG_gc;
33
  PMIC.CTRL = temp;
34
  
35
  SREG = sregtemp;
36
  
37
  /* Einstellen der Baudrate und aktivieren der Interrupts */
38
    
39
    
40
  sei();
41
 
42
  uart_puts("Hallo hier ist der Bootloader\n\r");
43
    _delay_ms(1000);
44
  
45
  while(1);
46
}

Für hilfreiche Tipps wäre ich sehr dankbar.

Grüße, Alex

von Stefan F. (Gast)


Lesenswert?

Vermutlich soll der Interrupt bei HI Pegel aktiv werden, nicht bei LO. 
So nutze ich das jedenfalls.

von Alexander H. (ill_son)


Lesenswert?

Der Interrupt wird ausgelöst, wenn das Sende-Register des UART leer ist. 
LO bezieht sich nicht auf den Pegel, sondern auf die Priorität des 
Interrupts.

von Alexander H. (ill_son)


Lesenswert?

Ein vorsichtiges "Up", in der Hoffnung, jemand weiß Rat und bevor der 
Thread im Orkus verschwindet.

Grüße, Alex

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.