logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

resetowanie Atmegi16 /uart i timer0

dturczak 29 Mar 2009 01:06 1428 11
REKLAMA
  • #1 6346992
    dturczak
    Poziom 19  
    
    #define F_CPU 8000000UL 
    #include <avr/io.h> 
    #include <util/delay.h> 
    #include <avr/interrupt.h>
    #include "1wire.h"
     
    
    signed char rozkaz;
    
    
    void USART_Transmit( char data )  //unsigned 
    { 
    
       while ( !( UCSRA & (1<<UDRE)) );   //wolny bufor
       UDR = data;                  
    
    } 
    
    SIGNAL(SIG_UART_RECV)
    {
    
    	//OCR0=0x00;
    	rozkaz=UDR;
    
    }
    
    
    int main(void) 
    { 
    
    DDRD=0x02; 
    PORTD=0x00;
    DDRB=0xFF; 
    
    
    
    //licznik w trybie PWM
    
    TCCR0=0x03; //pres 
    TCCR0|=_BV(WGM00);  TCCR0|=_BV(WGM01); //Fast PWM 
    TCCR0|=_BV(COM01);  TCCR0&=~_BV(COM00); //Fast PWM set compare,set bottom 
    OCR0=0xFF; 
    TCNT0=0x00; 
    TIMSK |= _BV(TOIE0); 
    
    //UART 
    
    UCSRA = _BV(U2X);  
    UBRRL = 103; 
    UCSRB = _BV(TXEN) | _BV(RXEN)| _BV(RXCIE); 
    UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); 
     
     sei();
    
    int i;
    
    USART_Transmit('e');
    
       while(1) 
      { 
      	
    
    	delay_us(100);
    
    } 
    
    }
    
    


    Nie rozumiem za bardzo gdzie robie zasadniczy blad ?
    ustawiajac w przerwaniu SIGNAL(SIG_UART_RECV) OCR0=0x00; zmiany na podlaczonej diodzie widze tylko na moment. Domyslam sie ze 'cos' resetuje mi uC i OCR0 wraca do wartosci 0xFF
    transmisja jest poprawnie zestawiona ,wszystko dzialalo ok poki nie musialem zastosowac odbior danych przez przerwanie ( i wlaczenie sei() )

    od PC ustawienia :

    
    port.setSerialPortParams(  
                9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 
    
    
  • REKLAMA
  • #2 6347022
    dawid512
    Poziom 32  
    Zmienna rozkaz powinna być volatile.
  • REKLAMA
  • #3 6347029
    dturczak
    Poziom 19  
    ok dzieki za przypomnienie...
    ale jak pewnie sie domyslasz problemu to nie rozwiazalo..
    aha..zewn kwarc 8Mhz u mnie,zeby nie bylo ze robie na wewnetrznym ;)
    Fuse Bit: 0xFE 0x99

    wywalilem tryb pwm a zamiast tego zwyklym portem sterowalem i ruszylo... wyglada na to ze to licznik jest przyczyna resetu tylko czemu ?
  • #4 6693281
    dturczak
    Poziom 19  
    Niestety znow mam ten sam problem,ktos sie spotkal z tym problemem,bo juz nie mam pomyslu co moze resetowac atmege w tym wypadku ?
  • #5 6693489
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Tu:

    TIMSK |= _BV(TOIE0);

    włączasz przerwanie.

    Tylko gdzie to przerwanie niby jest? Nie ma przerwania, więc wektor będzie wskazywał na "uniwersalny łapacz nieistniejących przerwań", który resetuje układ.

    Pozatym

    
    TCCR0=0x03; //pres 
    TCCR0|=_BV(WGM00);  TCCR0|=_BV(WGM01); //Fast PWM 
    TCCR0|=_BV(COM01);  TCCR0&=~_BV(COM00); //Fast PWM set compare,set bottom 
    


    Bardziej nieoptymalnie się tego nie dało napisać...

    Nie sądzisz, że:

    
    TCCR0=_BV(COM01)|_BV(WGM01)|_BV(WGM00)|0x03;
    


    da taki sam efekt przy użyciu dwóch rozkazów assemblera, a nie jakichś dwudziestu?

    4\/3!!
  • REKLAMA
  • #6 6693593
    dturczak
    Poziom 19  
    w sumie racja ,ale teraz testuje bezposrednio na kodzie
    
    #include <inttypes.h>
    #include "delay.h"
    #include <avr/interrupt.h>
    volatile char rozkaz[8];
    int kt;
    
    volatile char gg;
    
    SIGNAL(SIG_UART_RECV)
    {
    	gg=UDR;
    }
    
    int main(void) {
    
      DDRD=0x02; 
      PORTD=0x00;
    
      UCSRA = _BV(U2X);  //103
      UBRRL = 832; //207; //103; //51; 
      UCSRB =  _BV(RXEN)| _BV(RXCIE); /* rx enable */ 
      UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) | (1<<USBS);
      sei();
    
    
      int a;
      DDRD|=_BV(6);
      PORTD|=_BV(6);
      for(a=1;a<15;a++)delay_us(100); //blysk w celu wykrycia resetu
      PORTD&=~_BV(6);
    
      PORTD &= ~_BV(PD7);  
      DDRD |= _BV(PD7);  
      TCCR2 = _BV(WGM21) | _BV(WGM20) | _BV(COM21) | _BV(CS20);
      TCNT2=0x00;
      OCR2=120;
    
       while (1) 
       	{
    		for(a=1;a<15;a++)delay_us(10);
        }
    	
    }
    

    moze problem tkwi w ukladzie Prolific (kabel z komorki),ktory sluzy mi do emulacji rs232 ?
    zastanawia mnie tez sama wtyczka.mam 4 kabelki.
    bialy,zielony,czarny ,czerwony
    o ile pierwsze trzy maja zastosowanie (rx,tx,gnd) to czerwony za bardzo nie wiem z czym powiazac ? (vcc? ale przeciez uklad dziala a na samym kablu nie ma tez zadnego napiecia)
  • #8 6693928
    dturczak
    Poziom 19  
    pracuje na zewnetrznym kwarcu 16 Mhz,rozne predkosci uart'a..
    W momencie gdy zaczynam wysylac z pc porcje danych (duza ilosc) co jakis czas atmega mi sie resetuje.
    problem nie wystepuje przy wewnetrznym taktowaniu ustawionym na 8mhz.
  • REKLAMA
  • #9 6693997
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Istnieje szansa, że problem tkwi w sprzęcie - kiepska płytka, jakieś śmieci na zasilaniu. Jeśli problem byłby programowy, to można go zwykle powtórzyć precyzyjnie - czyli że układ resetuje się zawsze po znaku nr. 123, albo zawsze po otrzymaniu litery'a'.

    4\/3!!
  • #10 6695453
    dturczak
    Poziom 19  
    co prawda na plytce stykowej robione ale dosyc porzadnie ;)
    zasilanie z usb ,na plytce filtrowane kondensatorem..
    zmienilem kabel usb/rs232 i to samo :/
    wiec juz nie mam pojecia co moze byc tego przyczyna ;/
  • #11 6716702
    dturczak
    Poziom 19  
    Pomoglo po ustawieniu bitu CKOPT.
    Nie ma pojecia skad takie duze zaklocenia moga wystepowac w moim ukladize...
  • #12 6716721
    _Robak_
    Poziom 33  
    Ja tez ostatnio sie meczylem z resetowaniem ukladu zrobionego wlasnie na plytce stykowej. Takze jesli chodzi o plytke stykowa to tylko wewnetrzny generator ;)
REKLAMA