Tervehdys kaikille!
Olen uusi tyyppi sivustolla ja ohjelmointi jutut on aivan alkumetreillä.
Jostain syystä tuo C- ohjelmointi alkoi kiinnostaa, vaikka olenkin jo nuoruuteni ohittanut.
Kaiken C- osaamiseni olen opiskellut itsekseni kirjasta nimeltä öMicro – ohjaimen ohjelmointi C- kielellä 2ö (kirja ladattavissa ilmaiseksi osoitteesta www.microsalo.com)
Nyt olisi sitten apu tarpeen sarjaportin ohjelmoinnin kanssa.
Rauta Olimexin AVR-MT-128 www.olimex.com.
Ohjelmointi työkalut WinAVR ja AVR Studio 4
Olen tehnyt pari ohjelmaa, jotka käyttävät sarjaporttia.
Siinnä hieman yksinkertaisemmassa käytin sarjaportin lukemista öpollaamallaö toimi ihan ok.
UART:in lukemiseen käyttämäni koodinpätkä on suoraan olimexin sivun esimerkki.
Tässä toisessa sovelluksessa tuo pollaaminen ei tunnu oikein toimivan. Luettavaa dataa on tosi paljon, ja se tulee purskeissa, josta pitää löytää alkumerkki, osoite, datapurskeenpituus, itse data ja viimeksi vielä varmistus summa. Mutta asiaan:
Miten sarjaporttia (UART) saa luettua keskeytyksellä?
Periaate on selvillä, mutta?
- mitä keskeytys alustuksia pitää tehdä
- miten määritellään nopeus ym. 9600,8,n,1
- mistä löytyisi mallikoodin pätkä / esimerkki
Voin auttaa jonkin verran - tässä eräästä projektista koodia ATtiny2313-kontrollerille.
void UART_init() { //enable receiver UCSRB |= (1<<RXEN); //9-bit UCSRB |= (1<<UCSZ2); UCSRC |= (1<<UCSZ1)|(1<<UCSZ0); //9600 baud UBRRL=23; UBRRH=0x00; //enable the interrupt UCSRB |= (1<<RXCIE); } ISR(USART_RX_vect) { data = UDR; //foo }
Rekisterien nimissä on eroa, tuon ATmega128:n rekisterien nimet löydät datalehdeltä (alkaen s. 189).
Täällä on aika hyvä tutoriaali aiheesta.
Kiitti vinkeistä niistä oli isosti apua.
Näillä tuntuu toimivan. Jätin koodiin muutakin 128:n perus asetuksia,
jos vaikka olisi jolekkin hyötyä.
Rekisteri asetukset ja vektorin nimen jouduin kyllä kaivamaan manuaalista.
Tuo AT-MT-128 on ihan kiva palikka 2 x 16 merkin näyttö, näppis ja 2 kpl sarjaporttia. Kaikki valmiiksi koottuna. Hintakin oli minusta kohtuullinen.
Kotiin kannettuna veroineen yksinkappalein ~60€.
// 29.01.2011 // esimerkki kopsattu linkista // http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=48188&highlight=usart // muokattu suorittimelle ATmega 128 (rauta Olimex AVR-MT-128) // Ohjelmat WinAVR + AVR Studio 4 // vastaanotta merkin sarjaportista ja kaiuttaa sen takaisin. // Kayttaa keskeytysta // ******************** #include <avr/io.h> #include <avr/interrupt.h> #include <stdio.h> #define OSCSPEED 16000000 // CPU:n kiteen taajuus muunmuassa sarjaliikenne nopeuksien laskemista varten // ----------------------------------- // *** porttien asetukset ***** void PORT_Init() // ** porttien alustukset ** { // PORTA = 0b00000000; DDRA = 0b01000000; // Relay set as output (Bit6 = 1) // PORTB = 0b00000000; DDRB = 0b00000000; // PORTC = 0b00000000; DDRC = 0b11110111; PORTD = 0b11000000; DDRD = 0b00001000; // TX set as output (Bit3 = 1) // PORTE = 0b00000000; DDRE = 0b00110000; // Buzzer set as output (Bit4 = 1, Bit5 = 1) // PORTF = 0b00000000; DDRF = 0b00000000; // PORTG = 0b00000000; DDRG = 0b00000000; } // ------------------------------------ // *** sarjaliikenne asetukset ****** void UART_Init(uint32_t Baud) // funktio sarjaliikenne parametrien asettamista varten { unsigned int BaudRate = OSCSPEED / (16 * Baud) - 1; /* as per pg. 173 of the user manual */ //set BaudRate to registers UBRR1H and UBRR1L UBRR1H = (unsigned char) (BaudRate>>8); UBRR1L = (unsigned char) BaudRate; UCSR1C = UCSR1C | 0b10000110; // Set frame format: 8 data (Bit1 = 1, Bit2 = 1), 1 stop bit (Bit3 = 0) UCSR1B = UCSR1B | 0b10011000; // enable Receiver and Transmitter (Bit3 = 1, Bit4 = 1) // UCSR1B = UCSR1B | 0b11011000; // bit 7 == When the Receive Complete Interrupt Enable (RXCIE1) // bit 6 == When the Transmit Complete Interrupt Enable (RXCIE1) } // ------------------------------------- ISR(USART1_RX_vect) // keskeytysvektori, vastaanotto { char ReceivedByte; ReceivedByte = UDR1; // Fetch the recieved byte value into the variable "ByteReceived" UDR1 = ReceivedByte; // Echo back the received byte back to the computer } // ------------------------------------- // *** ohjelman alku ******************* // ************************************* int main (void) { sei(); // Enable the Global Interrupt Enable flag so that interrupts can be processed // cli(); // clear interrupts. Kiella kaikki keskeytykset // **** rs232 alustus ****************** // ************************************* unsigned char Ch; PORT_Init(); UART_Init(9600); // ==== rs232 end ====================== for (;;) // Loop forever { // Do nothing - echoing is handled by the ISR instead of in the main loop } } // === END === END === END ============= // =====================================
Aihe on jo aika vanha, joten et voi enää vastata siihen.