mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega64 Fehler bei RET


Autor: christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe nach der Umstellung vom Mega324P, mit dem alles lief, auf einen 
Mega64 das Problem dass er anscheinend nach einem rcall nicht richtig 
zurück springt. In der Simulation in AVR Studio funktioniert es zwar, 
aber auf dem Controller scheint er nicht zurück zu srpingen sondern 
weiter zu laufen. Nach ca 250µs (etwa 4000 cycles bei 16 MHz) kommt dann 
wieder mein Reset-Debug-Flag.

Hier mal der Code den ich zum testen und der Übersichtlichkeit halber in 
eine eigenes Programm gepackt hab. Wenn ich rcall/ret durch rjmp (die 
auskommentierten) ersetzte funktioniert es ohne Porbleme. Im komplexeren 
Orginalprogramm kann ich das aber so nicht lösen.
.include "m64def.inc" 

.def temp      = r16
.def data       = r17 

reset:
  sbi  porte, 7             ; Reset-Debug-Flag
  cbi  porte, 7
  sbi  porte, 7
  cbi  porte, 7

  ldi   temp, LOW(RAMEND)  ; Init stack pointer
  out   SPL, temp
  ldi   temp, HIGH(RAMEND)  
  out   SPH, temp
                           ; USB status flags
  cbi  DDRB, 6             ; PORTB 6 = RXF = input
  sbi  PORTB, 6            ; pull-up active
  cbi  DDRB, 7             ; PORTB 7 = TXE = input
  sbi  PORTB, 7            ; pull-up active

                           ; USB control pins
  sbi  DDRB, 4             ; PORTB 4 = RD = output
  sbi  PORTB, 4            ; set it high
  sbi  DDRB, 5             ; PORTB 5 = WR = output
  cbi  PORTB, 5            ; set it low


main:
  rcall  read_byte_usb
;  rjmp  read_byte_usb

write_byte_usb:
  ldi   temp, 0xFF  
  out   DDRE, temp         ; PORTD is output

  out  PORTE, data
  cbi  PORTB, 5
  sbi  PORTB, 5
  
  rjmp  main

read_byte_usb:
  ldi  temp, 0x00  
  out  DDRE, temp          ; PORTE is input
  ldi  temp, 0xFF
  out  PORTE, temp         ; pull-ups active

wait_for_RXF:
  sbis PINB, 6             ; exit wait loop if RXF (read ready) is low
  rjmp read_byte
  rjmp wait_for_RXF

read_byte:
  cbi  PORTB, 4            ; pull RD low to read from usb chip
  nop                      ; !!! KEEP THIS FOR TIMING !!!
  in   data, PINE          ; read
  sbi  PORTB, 4           ; set RD to high again
  ret
;  rjmp  write_byte_usb



Schonmal vielen Danke für etwaige Tips

grüße
christian

Autor: christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt.

Bei ATmega64 und ATmega128 muß unbedingt das MC103C-Fusebit (CompMode im 
AVRStudio) gelöscht werden. Bei mir war es bei frisch ausgeliefertem µC 
gesetzt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.