Forum: Mikrocontroller und Digitale Elektronik attiny2313 automatisch reset


von Johannes (Gast)


Lesenswert?

Hallo,
ich habe ein nrf24l01 modul an einem attiny2313. Doch dieser resettet 
sich automatisch nach/in der Konfiguration
1
int main(void){
2
  //extern_interrupt_init(); // INT0 -> falling edge
3
  usart_init(USART_MYUBRR);
4
  timer_interrupt_init(); // Timer0 -> 1ms
5
  io_init(); // PD5 -> output -> low
6
  spi_init();
7
  nrf24_init(); // initialize hardware pins
8
  nrf24_config(2,4); // channel #2, payload length: 4
9
  usart_transmit_string("> USART Ready to use \n");
10
...
1
void nrf24_config(uint8_t channel, uint8_t pay_length)//(2,4)
2
{
3
    /* Use static payload length ... */
4
    payload_len = pay_length;
5
6
    // Set RF channel
7
    nrf24_configRegister(RF_CH,channel);
8
9
    // Set length of incoming payload 
10
    nrf24_configRegister(RX_PW_P0, 0x00); // Auto-ACK pipe ...
11
    nrf24_configRegister(RX_PW_P1, payload_len); // Data payload pipe
12
    nrf24_configRegister(RX_PW_P2, 0x00); // Pipe not used 
13
    nrf24_configRegister(RX_PW_P3, 0x00); // Pipe not used 
14
    nrf24_configRegister(RX_PW_P4, 0x00); // Pipe not used 
15
    nrf24_configRegister(RX_PW_P5, 0x00); // Pipe not used 
16
17
    // 1 Mbps, TX gain: 0dbm
18
    nrf24_configRegister(RF_SETUP, (0<<RF_DR)|((0x03)<<RF_PWR));
19
20
    // CRC enable, 1 byte CRC length
21
    nrf24_configRegister(CONFIG,nrf24_CONFIG);
22
23
    // Auto Acknowledgment
24
    nrf24_configRegister(EN_AA,(1<<ENAA_P0)|(1<<ENAA_P1)|(0<<ENAA_P2)|(0<<ENAA_P3)|(0<<ENAA_P4)|(0<<ENAA_P5));
25
26
    // Enable RX addresses
27
    nrf24_configRegister(EN_RXADDR,(1<<ERX_P0)|(1<<ERX_P1)|(0<<ERX_P2)|(0<<ERX_P3)|(0<<ERX_P4)|(0<<ERX_P5));
28
29
    // Auto retransmit delay: 1000 us and Up to 15 retransmit trials
30
    nrf24_configRegister(SETUP_RETR,(0x04<<ARD)|(0x0F<<ARC));
31
32
    // Dynamic length configurations: No dynamic length
33
    nrf24_configRegister(DYNPD,(0<<DPL_P0)|(0<<DPL_P1)|(0<<DPL_P2)|(0<<DPL_P3)|(0<<DPL_P4)|(0<<DPL_P5));
34
35
    // Start listening
36
    nrf24_powerUpRx();
37
}

Lasse ich den string '> USART Ready to use' vor dieser Funktion 
ausgegeben, wird dieser immer erneut ausgegeben. Die Nachrichten vom 
UART sehe ich in HTerm.

Bei einem Atmega328p läuft die Config Funktion ohne änderungen durch.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Johannes schrieb:
> ich habe ein nrf24l01 modul an einem attiny2313. Doch dieser resettet
> sich automatisch nach/in der Konfiguration

Hallo!

Damit ich das Problem richtig verstehe, seien ein paar Rückfragen 
erlaubt:

Was bedeutet der Schrägstrich? Manchmal "nach" und manchmal "in" der 
Konfiguration? Oder ist der Zeitpunkt einfach nicht bekannt?

Schaltung? Kondensator vergessen?

von Johannes (Gast)


Lesenswert?

Markus W. schrieb:
> Oder ist der Zeitpunkt einfach nicht bekannt?

genau. Wenn ich die uart-Nachricht vor dieser Funktion rausgebe, wird es 
immer wiederholt. Wenn ich diese Nachricht erst danach rausgebe, wird 
sie gar nicht rausgeschickt.

Am Attiny habe ich zwischen Vcc und Gnd einen 100nF Kondensator. 
Zwischen Vcc und Reset habe ich einen 10kOHM Widerstand.

Werde die Schaltung mal skizzieren und hochladen

von holger (Gast)


Lesenswert?

>Doch dieser resettet sich automatisch nach/in der Konfiguration

So ist das halt bei Controllern mit zu wenig RAM für die Aufgabe.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Johannes schrieb:
> Am Attiny habe ich zwischen Vcc und Gnd einen 100nF Kondensator.
> Zwischen Vcc und Reset habe ich einen 10kOHM Widerstand.

Dann ist hardwareseitig vermutlich alles ok...

Hört sich für mich so an, als wäre ein Interrupt aktiviert, aber der 
zugehörige Interruptvektor nicht gesetzt (oder die benötigte 
Interrupt-Routine nicht definiert).

Könnte natürlich auch ein Stack-Überlauf sein oder etwas ähnlich 
Unanständiges.

von Johannes (Gast)


Lesenswert?

Markus W. schrieb:
> Hört sich für mich so an, als wäre ein Interrupt aktiviert, aber der
> zugehörige Interruptvektor nicht gesetzt (oder die benötigte
> Interrupt-Routine nicht definiert).

Als Interrupt habe ich eigentlich nur USART, Timer0 und INT0
1
void usart_init(unsigned int ubrr){
2
  /* Set Baud-Rate */
3
  UBRRH = (unsigned char) (ubrr >> 8);
4
  UBRRL = (unsigned char) ubrr;
5
  /* Enable Receiver and Transmitter and receiver-interrupt*/
6
  UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
7
  /* Set Frame format: 8 data, 2 stop bit */
8
  UCSRC = (1 << USBS) | (1 << UCSZ1) | (1 << UCSZ0);
9
}
10
11
void extern_interrupt_init(void){
12
  DDRB &= ~(1 << DDD2); // External Interrupt on INT0
13
14
  MCUCR |= (1 << ISC01); // INT0 falling edge
15
  MCUCR &= ~(1 << ISC00); // INT0 falling edge
16
17
  GIMSK |= (1 << INT0);  // enable INT0 interrupt
18
}
19
20
void timer_interrupt_init(void){
21
  // Timer 0
22
  TCCR0A = (1 << WGM01); // CTC Modus
23
  TCCR0B = (1 << CS01) ; // prescaler 8 -> 1Mhz/8 = 125kHz
24
  OCR0A = 125-1; // -> 1ms Interrupt
25
  TIMSK |= (1 << OCIE0A); // Overflow Interrupt allow
26
}

Die Interrupt Routinen sind auch erstellt
ISR(INT0_vect){
...
}

ISR(USART_RX_vect){
...
}

ISR (TIMER0_COMPA_vect){
...
}
[/code]

Markus W. schrieb:
> Könnte natürlich auch ein Stack-Überlauf sein oder etwas ähnlich
> Unanständiges.

Kann ich das irgendwie überprüfen?

von Johannes (Gast)


Lesenswert?

Ich bin mal in der Funktion reingegangen und wollte gucken, wann der 
Controller resettet wird.
Wenn ich hinter dem letzten Funktionsaufruf 'nrf24_powerUpRx();' die 
Nachricht herausschicke, wird diese herausgeschickt. Damit ist ja 
eigentlich die Funktion nrf24_config fertig und es wird wieder in die 
main-Funktion gesprungen. Wenn ich dann dort die Nachricht schicke, 
bleibt es beim Reset.

von Sebastian S. (amateur)


Lesenswert?

Spendier' uns mal die vollständige main-Routine.
Muss aber nicht sein...

Wenn der String ständig ausgegeben wird, heißt das doch nur, dass der 
Kerl ständig von vorne anfängt. Der Fehler kann aber auch hinter der 
Ausgaberoutine liegen.
Mit einem "ordentlichen" Fehler auf dem Stack, kann die Testsequenz auch 
von wer-weiß-wo aufgerufen werden. Speicherfehler oder schlampige 
Indizes sind hierbei sehr beliebt.

Ich klammere in solchen Fällen einfach, von vorne beginnend alle 
möglichen Kandidaten aus. Natürlich ohne die Initialisierung der 
seriellen Schnittstelle.

von Walter S. (avatar)


Lesenswert?

Johannes schrieb:
> Markus W. schrieb:
>> Könnte natürlich auch ein Stack-Überlauf sein oder etwas ähnlich
>> Unanständiges.
>
> Kann ich das irgendwie überprüfen?

du kannst das RAM mit einem definierten Wert füllen und bei Reset 
schauen wie viel davon noch übrig ist,
einfacher ist es den 4313 zu nehmen mit doppelt soviel RAM

von Johannes (Gast)


Lesenswert?

Das ist die vollständige main-funktion
1
int main(void){
2
  extern_interrupt_init(); // INT0 -> falling edge
3
  usart_init(USART_MYUBRR);
4
  timer_interrupt_init(); // Timer0 -> 1ms
5
  io_init(); // PD5 -> output -> low
6
  spi_init();
7
  nrf24_init(); // initialize hardware pins
8
  nrf24_config(2,4); // channel #2, payload length: 4
9
  /* Set the device addresses */
10
  nrf24_tx_address(spi_tx_address);
11
  nrf24_rx_address(spi_rx_address);
12
13
  sei(); // Global Interrupts activate
14
  usart_transmit_string("> USART Ready to use \n");
15
    while (1){
16
    receive();
17
    TOGGLEBIT(PORTD,5);
18
     //transmitt();
19
20
    _delay_ms(2000);
21
    
22
    }
23
}

von Johannes (Gast)


Lesenswert?

Es lag wirklich am Speicher.
Eigentlich bekomme doch bei Atmel Studio 7 eine Fehlermeldung, wenn zu 
viel Speicher benutzt wird. Dies war hier aber nicht der fall. Habe 
jetzt die UART-Narchichten herausgenommen und das Data-Memory-Usage ist 
geringer geworden. Jetzt läuft das PRogramm durch. Zwar nicht richtig, 
aber für heute reicht das erst mal.

von Dietrich L. (dietrichl)


Lesenswert?

Johannes schrieb:
> Eigentlich bekomme doch bei Atmel Studio 7 eine Fehlermeldung, wenn zu
> viel Speicher benutzt wird. Dies war hier aber nicht der fall.

Das betrifft aber nur den fest belegten Speicher. Was für den Stack 
dynamisch noch benötigt wird weiß der Compiler aber nicht und hängt u.A. 
von der Schachtelungstiefe der SW ab.

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.