Skocz do zawartości

[Dla początkujących] Podłączanie i obsługa urządzeń zewnętrznych w robotyce i elektronice


Pomocna odpowiedź

Jeszcze jedno niedopatrzenie.

Do pinów CURRENT SENSING A i B (L298N) można podłączyć rezystory do masy, zmniejszając w ten sposób prąd płynący przez silniki. Jeżeli chcemy, aby do silników płynął maksymalny prąd, podłączamy te wyjścia po prostu do masy.

Nie do końca może jasno napisane.

  • Lubię! 1
Link do komentarza
Share on other sites

Witam, kompilator wyrzuca mi następujący komunikat:

napis.c:169: error: old-style parameter declarations in prototyped function definition jaki styl?

napis.c:169: error: expected '{' at end of input

#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>

#define DDR_DB4 DDRB 
#define PORT_DB4 PORTB
#define DB4 PB4 

#define DDR_DB5 DDRB 
#define PORT_DB5 PORTB
#define DB5 PB5 

#define DDR_DB6 DDRB 
#define PORT_DB6 PORTB
#define DB6 PB6 

#define DDR_DB7 DDRB 
#define PORT_DB7 PORTB
#define DB7 PB7 /

#define DDR_RS DDRB  
#define PORT_RS PORTB
#define RS PB2 

#define DDR_EN DDRB 
#define PORT_EN PORTB
#define EN PB3 


#define SET_DB4 PORT_DB4|=_BV(DB4)
#define CLR_DB4 PORT_DB4&=~(_BV(DB4))

#define SET_DB5 PORT_DB5|=_BV(DB5)
#define CLR_DB5 PORT_DB5&=~(_BV(DB5))

#define SET_DB6 PORT_DB6|=_BV(DB6)
#define CLR_DB6 PORT_DB6&=~(_BV(DB6))

#define SET_DB7 PORT_DB7|=_BV(DB7)
#define CLR_DB7 PORT_DB7&=~(_BV(DB7))

#define SET_RS PORT_RS|=_BV(RS)
#define CLR_RS PORT_RS&=~(_BV(RS))

#define SET_EN PORT_EN|=_BV(EN)
#define CLR_EN PORT_EN&=~(_BV(EN))


void set_half_byte(char x); 
void write_to_LCD(char x); 
void write_command(char x);
void write_char(char x);
void write_text(char*s);
void LCDxy(char x, char y)
void clear_LCD (void);
void init_LCD(void);


int main (void)

{
char s= "W";

init_LCD();
write_text(s);
for(;;)
return 0;
}  

void set_half_byte(char x)
{
if (x & _BV(0)) SET_DB4; 
else CLR_DB4;

if (x & _BV(1)) SET_DB5;
else CLR_DB5;

if (x & _BV(2)) SET_DB6;
else CLR_DB6;

if (x & _BV(3)) SET_DB7;
else CLR_DB7;
}


void write_to_LCD(char x) 
{
SET_EN; 
set_half_byte (x>>4); 
CLR_EN; 

SET_EN; 
set_half_byte(x); 
CLR_EN; 
_delay_ms(1); 

}



void write_command(char x) 
{ 
CLR_RS;                      
write_to_lcd(x);            
} 


void write_char(char x) 
{ 
SET_RS;                      
write_to_lcd(x);            
}


void write_text(char * s) 
{ 
while(*s)       
 { 
 writechar(*s);  
 s++;            
 } 
}


void LCDxy(char x,char y) 
{ 
  unsigned char com=0x80; 
  com|=(x|(y<<6)); 
  write_command(com); 
}


void clear_LCD(void) 
{ 
   writecommand(0x01); 
}


void init_LCD() 
{ 
DDR_DB4 |= _BV(DB4);     
DDR_DB5 |= _BV(DB5); 	 
DDR_DB6 |= _BV(DB6);     
DDR_DB7 |= _BV(DB7);     
DDR_EN|= _BV(EN);        
DDR_RS |= _BV(RS);                        
_delay_ms(20);           
CLR_EN;                  
CLR_RS;                       

char i;     
for (i=0;i<3;i++)                    
 { 
 SET_EN;                   
 set_half_byte(0x03);    
 CLR_EN;                 
 _delay_ms(5);         
 } 

SET_EN;                   
out_nibble(0x02);      
CLR_EN;                
_delay_ms(1);          
write_command(0x28);   
write_command(0x08);
write_command(0x01);   
write_command(0x06);   
write_command(0x0C);    
}
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Trochę błędów masz:

void LCDxy(char x, char y) 

Zapomniałeś średnika. F_CPU nie definiujemy w kodzie tylko ustawiamy w opcjach projektu. Potem:

char s= "W";

zamień na:

char* s= "W";

Potem tę linię:

#define DB7 PB7 /

Na tę zamień:

#define DB7 PB7

Jeszcze porobiłeś literówki w funkacjach np zamiast LCD dałeś lcd itp.

Link do komentarza
Share on other sites

Witam, poprawiłem program

Ale nic nie wyświetla.

Panowie proszę o prześledzenie programu, kompilator nic nie krzyczy ładuje program do AVR i nic się nie dzieje gdzie może być błąd?

#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>



#define DDR_DB4 DDRB 
#define PORT_DB4 PORTB
#define DB4 PB4 

#define DDR_DB5 DDRB 
#define PORT_DB5 PORTB
#define DB5 PB5 

#define DDR_DB6 DDRB 
#define PORT_DB6 PORTB
#define DB6 PB6 

#define DDR_DB7 DDRB 
#define PORT_DB7 PORTB
#define DB7 PB7 

#define DDR_RS DDRB 
#define PORT_RS PORTB
#define RS PB2 

#define DDR_EN DDRB 
#define PORT_EN PORTB
#define EN PB3 


#define SET_DB4 PORT_DB4|=_BV(DB4)
#define CLR_DB4 PORT_DB4&=~(_BV(DB4))

#define SET_DB5 PORT_DB5|=_BV(DB5)
#define CLR_DB5 PORT_DB5&=~(_BV(DB5))

#define SET_DB6 PORT_DB6|=_BV(DB6)
#define CLR_DB6 PORT_DB6&=~(_BV(DB6))

#define SET_DB7 PORT_DB7|=_BV(DB7)
#define CLR_DB7 PORT_DB7&=~(_BV(DB7))

#define SET_RS PORT_RS|=_BV(RS)
#define CLR_RS PORT_RS&=~(_BV(RS))

#define SET_EN PORT_EN|=_BV(EN)
#define CLR_EN PORT_EN&=~(_BV(EN))


void set_half_byte(char x); 
void write_to_LCD(char x); 
void write_command(char x);
void write_char(char x);
void write_text(char*s);
//void LCDxy(char x, char y);
void clear_LCD (void);
void init_LCD(void);


int main (void)

{
char *s= "W";

init_LCD();
write_text(s);
for(;;)
return 0;
}  

void set_half_byte(char x)
{
if (x & _BV(0)) SET_DB4; 
else CLR_DB4;

if (x & _BV(1)) SET_DB5;
else CLR_DB5;

if (x & _BV(2)) SET_DB6;
else CLR_DB6;

if (x & _BV(3)) SET_DB7;
else CLR_DB7;
}


void write_to_LCD(char x) 
{
SET_EN; 
set_half_byte (x>>4); 
CLR_EN; 

SET_EN; 
set_half_byte(x); 
CLR_EN; 
_delay_ms(1); 

}

void write_command(char x) 
{ 
CLR_RS;                      
write_to_LCD(x);            
} 


void write_char(char x) 
{ 
SET_RS;                       
write_to_LCD(x);            
}


void write_text(char * s) 
{ 
while(*s)      
 { 
 write_char(*s);  
 s++;   

 } 
}


void LCDxy(char x,char y) 
{ 
  unsigned char com=0x80; 
  com|=(x|(y<<6)); 
  write_command(com); 
}



void clear_LCD (void) 
{ 
   write_command(0x01); 
}


void init_LCD(void) 
{ 
DDR_DB4 |= _BV(DB4);     
DDR_DB5 |= _BV(DB5); 	 
DDR_DB6 |= _BV(DB6);     
DDR_DB7 |= _BV(DB7);     
DDR_EN|= _BV(EN);        
DDR_RS |= _BV(RS);        



_delay_ms(20);           
CLR_EN;                 
CLR_RS;                       

char i;       
for (i=0;i<3;i++)         

 { 
 SET_EN;                   
 set_half_byte(0x03);     
 CLR_EN;                 
 _delay_ms(5);          
 } 

SET_EN;                   
set_half_byte(0x02);        
CLR_EN;                 
_delay_ms(1);          

write_command(0x28);    
write_command(0x08);    
write_command(0x01);    
write_command(0x06);    
write_command(0x0C);    

}
Link do komentarza
Share on other sites

Witam.

Mam problem z termometrem DS18b20, a mianowicie funkcja DS_Reset() cały czas zwraca mi presence=0. Podejżewam, że jest to wina funkcji _delay_, bo być może opóźnienia są za długie lub za krótkie. Stąd moje pytania:

1. Czy ktoś sprawdzał w praktyce ten kod?

2. Czy w funkcji _delay_ znaczenie ma częstotliwość pracy procesora (u mnie 1MHz)?

Z góry dzięki.

Link do komentarza
Share on other sites

Dzięki, ale czytałem już ten opis 1-wire (jest nawet wydanie drugie) 🙂

Termometr mam podłączony wg schematu: https://www.forbot.pl/forum/upload_img/obrazki/IMG_5217ad3f902823312.jpg .

Próbowałem różnych bibliotek, ale albo nic nie pokazywał, albo pokazywał ?*C.

Gdzieś czytałem, że 1-wire potrzebuje wyższej częstotliwości niż 1Mhz. To prawda 🙂?

@ciscoc

Z tego co wiem to funkcje _BV są przestarzałe i jak chcesz to tu masz fajną bibliotekę do LCD:

http://radzio.dxp.pl/hd44780/ .

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.