claudio Postat Ianuarie 25, 2011 Partajează Postat Ianuarie 25, 2011 Salut, Am incercat sa fac un program de testare a porturilor unui microcontroler, dar primesc 18 warning-uri de genul acesta: "warning: large integer implicitly truncated to unsigned type". Treaba asta cu pointeri si caractere nu am reusit sa o inteleg. Rog pe cineva sa-mi corecteze programul si deasemenea sa-mi dea si explicatiile Multumesc mult. Mai jos listingul programului: #define F_CPU 16000000UL#include <avr/io.h>#include <util/delay.h>uint8_t test=0;void test_mb(char mode, uint8_t port);int main(){ while(1) { test=0; switch(test) { case 0: test_mb('light_port','A'); break; case 1: test_mb('light_port','B'); break; case 2: test_mb('light_port','C'); break; case 3: test_mb('light_port','D'); break; case 4: test_mb('blink_port','A'); break; case 5: test_mb('blink_port','B'); break; case 6: test_mb('blink_port','C'); break; case 7: test_mb('blink_port','D'); break; } }}void test_mb(char mode, uint8_t port){ if(mode=='light_port') { switch(port) { case 'A': DDRA = 0xFF; PORTA = 0xFF; _delay_ms(3000); PORTA = 0x00; break; case 'B': DDRB = 0xFF; PORTB = 0xFF; _delay_ms(3000); PORTB = 0x00; break; case 'C': DDRC = 0xFF; PORTC = 0xFF; _delay_ms(3000); PORTC = 0x00; break; case 'D': DDRD = 0xFF; PORTD = 0xFF; _delay_ms(3000); PORTD = 0x00; break; } } if(mode=='blink_port') { switch(port) { case 'A': DDRA = 0xFF; PORTA = 0xFF; _delay_ms(1000); PORTA = 0x00; _delay_ms(1000); break; case 'B': DDRB = 0xFF; PORTB = 0xFF; _delay_ms(1000); PORTB = 0x00; _delay_ms(1000); break; case 'C': DDRC = 0xFF; PORTC = 0xFF; _delay_ms(1000); PORTC = 0x00; _delay_ms(1000); break; case 'D': DDRD = 0xFF; PORTD = 0xFF; _delay_ms(1000); PORTD = 0x00; _delay_ms(1000); break; } }} Link spre comentariu
godFather89 Postat Ianuarie 26, 2011 Partajează Postat Ianuarie 26, 2011 if(mode=='light_port')In primul rand, string-urile se pun intre apostrofi dublii "text".In al 2-lea rand, string-urile nu se declara char. char este un caracter si are dimensiunea de un byte. In majoritatea compilatoarelor, implicit este cu semn iar unsigned char fara semn. Daca vrei un sir de caractere, atunci il declari ca un vector de caractere (char test[] = "Test string";). De altfel in c nu se compara sirurile de caractere cu == deoarece sunt vectori, spre deosebire de c++ unde exista clasa string. String-urile se compara cu strcmp sau variatiile acestuia.Nu ai precizat in ce ai incercat sa compilezi programul...Sfat: Foloseste si else-urile in lanturile decizionale (if dupa if dupa if) pana la urma viteza conteaza pe un microcontroller. De altfel, puteai sa folosesti un switch pentru mode, la fel cum ai facut pentru port.incearca asa : #define F_CPU 16000000UL#include <avr/io.h>#include <util/delay.h>uint8_t test=0;void test_mb(char mode, uint8_t port);#define LIGHT_PORT 1#define BLINK_PORT 2int main(){ while(1) { test=0; switch(test) { case 0: test_mb(LIGHT_PORT,'A'); break; case 1: test_mb(LIGHT_PORT,'B'); break; case 2: test_mb(LIGHT_PORT, 'C'); break; case 3: test_mb(LIGHT_PORT,'D'); break; case 4: test_mb(BLINK_PORT,'A'); break; case 5: test_mb(BLINK_PORT,'B'); break; case 6: test_mb(BLINK_PORT,'C'); break; case 7: test_mb(BLINK_PORT,'D'); break; } }}void test_mb(char mode, uint8_t port){ if(mode==LIGHT_PORT) { switch(port) { case 'A': DDRA = 0xFF; PORTA = 0xFF; _delay_ms(3000); PORTA = 0x00; break; case 'B': DDRB = 0xFF; PORTB = 0xFF; _delay_ms(3000); PORTB = 0x00; break; case 'C': DDRC = 0xFF; PORTC = 0xFF; _delay_ms(3000); PORTC = 0x00; break; case 'D': DDRD = 0xFF; PORTD = 0xFF; _delay_ms(3000); PORTD = 0x00; break; } } else if(mode==BLINK_PORT) //oricum ai doar 2 moduri, if-ul asta e in plus (decat daca vrei sa mai faci moduri) { switch(port) { case 'A': DDRA = 0xFF; PORTA = 0xFF; _delay_ms(1000); PORTA = 0x00; _delay_ms(1000); break; case 'B': DDRB = 0xFF; PORTB = 0xFF; _delay_ms(1000); PORTB = 0x00; _delay_ms(1000); break; case 'C': DDRC = 0xFF; PORTC = 0xFF; _delay_ms(1000); PORTC = 0x00; _delay_ms(1000); break; case 'D': DDRD = 0xFF; PORTD = 0xFF; _delay_ms(1000); PORTD = 0x00; _delay_ms(1000); break; } }} Link spre comentariu
claudio Postat Ianuarie 26, 2011 Autor Partajează Postat Ianuarie 26, 2011 Multumesc mult pentru raspuns. M-ai lamurit acum si in plus mi-ai oferit o metoda mult mai buna de rezolvare. Chiar nu avea rost sa ma complic cu stringuri si comparare de stringuri. Iar ideea de a folosi if-if-if fara else, nu stiam ca influienteaza viteza de functionare, iar metoda de a folosi switch in switch mi se parea prea incurcata. Numai bine. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum