mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA162 teilt Takt willkürlich


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich habe einen Mega162 mit einem 7,37MHz Baudratenquarz am rennen. Dabei 
ist mir aufgefallen, dass sporadisch 2-6s nach Power-On die 
Befehlsfrequenz plötzlich um den Faktor 8 geteilt wird. Die 
Pinwackel-Testroutine erzeugt also plötzlich eine 8x kleinere Frequenz. 
Das passiert allerdings nicht, wenn ich die Interrupts abschalte.

In dem "langsamen" Zustand habe ich das CLKPR-Register überprüft, aber 
es ist auf keine Taktteilung eingestellt. Teile ich den Takt mittels 
CLKPR, teilt dies die Systemfrequenz ordnungsgemäß, die sporadische 
/8-Teilung bleibt.

seltsamerweise sendet der USART0 mit 115,2kBaud mit konstanter 
Geschwindigkeit - ungeachtet dem kleineren Befehlsdurchsatz.
.include "m162def.inc"

.equ  LED_O    = PORTE
.equ  LED1    = 0
.equ  LED2    = 2

; PORTD
.equ  WR485_1    = 4

.def  ZERO    = r2
.def  ONE    = r3
.def  SREGSAVE  = r4
.def  TEMP1    = r16
.def  TEMP2    = r17
.def  LOOP1    = r20

;************************************************
; CODE

.cseg

.org  0x0000
  rjmp    RESET
.org  INT0addr
  rjmp    INT_ERRORLINE
.org  INT1addr
  rjmp    INT_POWERFAIL
.org  OVF1addr
  rjmp    TIMER1
.org  URXC0addr
  rjmp    INT_NEUER_WINKEL
.org  URXC1addr
  rjmp    INT_GET_BYTE
.org  UTXC1addr
  rjmp    INT_SEND_BYTE
TIMER1:
  in  SREGSAVE,SREG

  push  TEMP1

  sbic  PORTE,2
  rjmp  T1
  sbi  PORTE,2
  rjmp  T2
T1:
  cbi  PORTE,2
T2:

  ldi  TEMP1,0xF1
  out  TCNT1H,TEMP1
  dec  TEMP1
  out  TCNT1L,TEMP1

  inc  r25
  andi  r25,0x0f
  cpi  r25,15
  brlo  T3
  ldi  r24,0x80
  rjmp  T4
T3:  ldi  r24,0x40
T4:  ori  r24,0x3F
  out  PORTC,r24

  pop  TEMP1

  out  SREG,SREGSAVE
  reti

;************************************************
; Reset
TABLE_INIT:
; Init Registers
  .db  0x20+PORTA,  0b11111111 ;= Relay Low-Aktiv
  .db  0x20+DDRA,  0b00000000
  .db  0x20+PORTB,  0b11110101 ;= Pull-Up
  .db  0x20+DDRB,  0b00001010
  .db  0x20+PORTC,  0b11111111 ;= Pull-Up
  .db  0x20+DDRC,  0b11000000
  .db  0x20+PORTD,  0b11001011 ;= ERR_OUT High-Aktiv , ERR_IN Floating
  .db  0x20+DDRD,  0b00110000
  .db  0x20+PORTE,  0b00000000
  .db  0x20+DDRE,  0b00000101
; Init Periphereals
  ; Winkel - UART
  ; UART0 : 115,2 kBaud, Even Parity, 1 Start, 1 Stop, 9 bit, RX-INT
  .db  0x20+UBRR0H,  0
  .db  0x20+UBRR0L,  3
  .db  0x20+UCSR0A,  0
  .db  0x20+UCSR0B,  (1<<RXCIE)|(1<<RXEN)|(1<<TXEN)|(1<<UCSZ2)
  .db  0x20+UCSR0C,  (1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1)|(1<<URSEL)
  ; Kommunikation - UART
  ; UART1 : 115,2 kBaud, Even Parity, 1 Start, 1 Stop, 9 bit, RX und TX-INT
  .db  0x20+UBRR1H,  0
  .db  0x20+UBRR1L,  3
  .db  0x20+UCSR1A,  (1<<MPCM1)
  .db  0x20+UCSR1B,  (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN)|(1<<UCSZ2)
  .db  0x20+UCSR1C,  (1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1)|(1<<URSEL)
  ; Analog-Comparator abschalten
  .db  0x20+ACSR,  (1<<ACIC)
  .db  0x20+TCNT1H,  0xF1
  .db  0x20+TCNT1L,  0xF0
  .db  0x20+TCCR1B,  (1<<CS12)|(1<<CS10)
  .db  0x20+TCCR0,  (1<<CS02)|(1<<CS00)
  .db  0x20+TIMSK,  (1<<TOIE1)

  ; Interrupt 0 und 1 fallende Flanke
  ; External Memory Interface, keine Addressbits
  .db  0x20+MCUCR,  (1<<SRE)|(1<<ISC11)|(1<<ISC01)
  .db  0x20+SFIOR,  (1<<XMM0)|(1<<XMM1)|(1<<XMM2)
  .db  0x20+GICR,  (1<<INTF1)|(1<<INTF0)

; Init System
  .db  0x20+SPH,  HIGH(RAMEND)
  .db  0x20+SPL,  LOW(RAMEND)  ; Stack Pointer

; End of Table
  .db  0,0
RESET:
  clr  ZERO
  clr  ONE
  inc  ONE
  ldi  ZL,LOW(TABLE_INIT*2)
  ldi  ZH,HIGH(TABLE_INIT*2)
  clr  YH
RESET_PERIPHERY:
  lpm  YL,Z+
  cpi  YL,0
  breq  RESET_PERIPHERY_DONE
  lpm  TEMP1,Z+
  st  Y,TEMP1    ; Register schreiben
  rjmp  RESET_PERIPHERY
RESET_PERIPHERY_DONE:
  
;  sei
  rjmp  MAIN

;************************************************
; INTERRUPT : Errorleitung unterbrochen
INT_ERRORLINE:

  reti

;************************************************
; INTERRUPT : Stromzufuhr unterbrochen
INT_POWERFAIL:
  cbi  PORTE,2
  sbi  PORTE,0
  sbi  PORTC,6
  sbi  PORTC,7
  reti

;************************************************
; INTERRUPT : Neuer Winkel (UART0)
INT_NEUER_WINKEL:
  reti

;************************************************
; INTERRPUT : Rec. Byte (UART1)
INT_GET_BYTE:
  reti

;************************************************
; INTERRUPT : Send Byte (UART1)
INT_SEND_BYTE:
  reti


MAIN:
  sbi  PORTD,WR485_1
  nop
  nop
  nop
  nop
  nop
  nop
  cbi  PORTD,WR485_1
  nop
  nop
  nop
  nop
  rjmp  MAIN


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Fuses sind wie folgt:

Brown-out bei 2,7V
JTAG disabled
SPI enabled
OCD Disabled
Preserve EEPROM enabled
CLKDIV8 disabled
Ext. Quarz 3-8MHz, startup 1K CK + 4.1ms

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.