Hello,
Somebody can help me, because I two day tried understand why my code doen't work. Your are last hope for me. I send from atmega8 information eg. "125r" from uart. atmega16 get information and char convert to int number. If I using small code it is work.The code which is work is
#include<avr/io.h> #include<avr/delay.h> #include <avr/interrupt.h> #include <string.h> #define F_CPU 8000000 #define BAUDRATE 2400 #define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1) volatile unsigned char rx_data=0; volatile unsigned int new_rx_data=0; volatile unsigned int skaic[8]; volatile unsigned int sk=0; void USART_Init(void) { UBRRL=(uint8_t)UBRRVAL; UBRRH=(UBRRVAL>>8); UCSRC=(1<<URSEL)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0); UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); } void USART_simbolis(unsigned char *data) { while((UCSRA&(1<<UDRE)) == 0); UDR = data; } void USART_siuntimas(unsigned char *data) { while(*data!=0) { while((UCSRA&(1<<UDRE)) == 0); UDR = *data; data++; } } ISR(USART_RXC_vect) { rx_data=UDR; new_rx_data=1; } void main() { char buffer[8]={000000000}; int ty; USART_Init(); sei(); while(1) { if(new_rx_data) { if(rx_data=='r') { skaic[sk]='m'; sk=0; ty=0; char *k=&skaic; while(*k!='m') { if((*k>='0')&&(*k<='9')) { buffer[ty]=*k; ty++; } k++; } USART_siuntimas(buffer); DDRB=atoi(buffer); } else { skaic[sk]=rx_data; sk=sk+1; } new_rx_data=0; } } }
But If same using another program it is bigger
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <string.h> #define SegDataPort PORTA #define SegDataDDR DDRA #define SegCntrlPort PORTC #define SegCntrlDDR DDRC #define F_CPU 8000000 #define BAUDRATE 2400 #define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1) volatile uint16_t vienetas=0; volatile uint16_t desimt=0; volatile uint16_t desimt1=0; volatile uint16_t simtas=0; volatile uint16_t simtas1=0; volatile uint16_t tukstantis=0; volatile uint16_t tukstantis1=0; volatile uint16_t desimttuks=0; volatile uint16_t k=0; volatile uint32_t i=0; volatile unsigned int u=0; volatile unsigned int sk=0; volatile unsigned int skaic[8]; volatile unsigned char rx_data=0; volatile unsigned int new_rx_data=0; //========================================================== void USART_Init(void) { UBRRL=(uint8_t)UBRRVAL; UBRRH=(UBRRVAL>>8); UCSRC=(1<<URSEL)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0); UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); } void USART_simbolis(unsigned char *data) { while((UCSRA&(1<<UDRE)) == 0); UDR = data; } void USART_siuntimas(unsigned char *data) { while(*data!=0) { while((UCSRA&(1<<UDRE)) == 0); UDR = *data; data++; } } ISR(USART_RXC_vect) { rx_data=UDR; new_rx_data=1; } //========================================================== unsigned char DigitTo7SegEncoder(int digit, int common) { int SegVal; switch(digit) { case 0: if(common == 1) SegVal = 0b01111110; else SegVal = ~0b01111110; break; case 1: if(common == 1) SegVal = 0b00011000; else SegVal = ~0b00011000; break; case 2: if(common == 1) SegVal = 0b01101101; else SegVal = ~0b01101101; break; case 3: if(common == 1) SegVal = 0b00111101; else SegVal = ~0b00111101; break; case 4: if(common == 1) SegVal = 0b000011011; else SegVal = ~0b000011011; break; case 5: if(common == 1) SegVal = 0b00110111; else SegVal = ~0b00110111; break; case 6: if(common == 1) SegVal = 0b01110111; else SegVal = ~0b01110111; break; case 7: if(common == 1) SegVal = 0b00011100; else SegVal = ~0b00011100; break; case 8: if(common == 1) SegVal = 0b01111111; else SegVal = ~0b01111111; break; case 9: if(common == 1) SegVal = 0b00111111; else SegVal = ~0b00111111; break; } return SegVal; } void main() { char buffer[8]={000000000}; int ty; SegDataDDR = 0xFF; SegCntrlDDR = 0xFF; SegCntrlPort = 0xFF; USART_Init(); sei(); while(1) { if(new_rx_data) { if(rx_data=='r') { skaic[sk]='m'; sk=0; ty=0; char *k=&skaic; while(*k!='m') { if((*k>='0')&&(*k<='9')) { buffer[ty]=*k; ty++; } k++; } USART_siuntimas(buffer); DDRB=atoi(buffer); } else { skaic[sk]=rx_data; sk++; } new_rx_data=0; } SegDataPort=0; SegCntrlPort = 0x00; _delay_us(500); SegDataPort = DigitTo7SegEncoder(i%10,1); SegCntrlPort = 0x01; _delay_us(3000); SegDataPort=0; SegCntrlPort = 0x00; _delay_us(500); if(i<100) {desimt=i/10;} if(i>=100) {desimt1=i%100; desimt=desimt1/10; } SegDataPort = DigitTo7SegEncoder(desimt,1); SegCntrlPort = 0x02; _delay_us(3000); SegDataPort=0; SegCntrlPort = 0x00; _delay_us(500); if((i>=100)&&(i<1000)) {simtas=i/100;} if(i>=1000) { simtas1=i/100; simtas=simtas1%10; } SegDataPort = DigitTo7SegEncoder(simtas,1); SegCntrlPort = 0x04; _delay_us(3000); SegDataPort=0; SegCntrlPort = 0x00; _delay_us(500); if((i>=1000)&&(i<10000)) {tukstantis=i/1000;} if(i>=10000) { tukstantis1=i/1000; tukstantis=tukstantis1%10; } SegDataPort = DigitTo7SegEncoder(tukstantis,1); SegCntrlPort = 0x08; _delay_us(3000); SegDataPort=0; SegCntrlPort = 0x00; _delay_us(500); SegDataPort = DigitTo7SegEncoder(i/10000,1); SegCntrlPort = 0x10; _delay_us(3000); } return 0; }
I from atmega8 send "128r", but got terrible number I attached picture below
Maybe can somebody explain for me why I get that? Or give to me advice how solve this problem. Thank you in advance