attiny2313 automatisch reset

Gast #4634780
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.
(Firma: guloshop.de) #4634783
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?
Gast #4634787
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
(Firma: guloshop.de) #4634794
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.
Gast #4634818
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?
Gast #4634821
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.
#4634822
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.
Gast #4634840
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
}
Gast #4634884
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren