Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Lapozás: OK   686 / 837
(#) pont válasza csatti2 hozzászólására (») Aug 24, 2015 /
 
Egy APB mini PLC. Megmondom őszintén kontrollerrel még nem kötöttem direktbe össze, de a TTL ic-kkel csak úgy működött, ha az 555-ös triggerelőt közéjük raktam. (viszont például a 4017-esnek jó volt simán a plc jele) Sőt ez igaz volt pár tíz centiig, de mikor 10 méterre elkerültek egymástól, az 1Khz-nél nagyobb jelet (most 20Khz-es) még egy opto-n keresztül kellett az 555-ösnek adni, hogy működjön. Szóval kevés tudás de sok-sok próbálkozás van már ebben a fűtésben de legalább azt csinálja amit én szeretnék
(#) szdani hozzászólása Aug 24, 2015 /
 
Sziasztok!
Egy olyan eszközön dolgozok ami UART-al kommunikálna, viszont az vele a problémám hogy amikor strcmp-vel összehasonlítom a kapott parancsot akkor hibaüzenetet dob hogy nem egyezik. A kapott parancsot vissza is küldöm a számítógép felé és látom hogy az amit elküldtem és el kéne fogadnia. Mi lehet a hiba?
  1. /*
  2.  * uart_TEST.c
  3.  *
  4.  * Created: 2015. 08. 24. 18:01:07
  5.  *  Author: Pézsma
  6.  */
  7.  
  8. #define F_CPU 3686400UL
  9.  
  10. #include <avr/io.h>
  11. #include <avr/pgmspace.h>
  12. #include <avr/interrupt.h>
  13. #include <avr/eeprom.h>
  14. #include <util/delay.h>
  15. #include <string.h>
  16. #include <stdint.h>
  17. #include <avr/io.h>
  18. #include <avr/eeprom.h>
  19. #include <inttypes.h>
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include "lcd.h"
  23.  
  24. #define UBRR_2400 95
  25. #define UBRR_4800 47
  26. #define UBRR_9600 23
  27. #define UBRR_19200 11
  28. #define UBRR_38400 5
  29. #define UBRR_57600 3
  30. #define UBRR_115200 1
  31. #define TRANSFER_DELAY 1
  32.  
  33. volatile char receive_TMP_buffer[20];
  34. volatile char receive;
  35. char receive_cmd[5];
  36.  
  37.  
  38. void USART_init( unsigned int ubrr ) {
  39.         UBRR0H = (unsigned char)(ubrr>>8);
  40.         UBRR0L = (unsigned char)ubrr;
  41.         UCSR0B = (1 << TXEN0) | (1 << RXEN0);    
  42.         UCSR0B |= (1 << RXCIE0 );
  43.         UCSR0C = (3 << UCSZ00);    //asynchronous 8 N 1
  44.    }
  45.  
  46. void UART_send_buf(char *buffer) {
  47.     int k;
  48.     k=0;
  49.     while(buffer[k]!='\0') {
  50.         while (!(UCSR0A & (1 <<UDRE0)));
  51.         UDR0=buffer[k];
  52.         k++;
  53.         _delay_ms(TRANSFER_DELAY);
  54.     }
  55. }
  56.  
  57. void UART_add_byte_to_string(char *dest,char data) {
  58.     int shossz;
  59.     shossz = strlen(dest);
  60.         dest[shossz] = data;
  61.     dest[shossz+1] = '\0';
  62. }
  63.  
  64. int main(void) {
  65.  
  66.     lcd_init();
  67.         USART_init(UBRR_115200);
  68.  
  69.     sei();     
  70.     while(1) {
  71.  
  72.     if(receive=='\n') {
  73.     if(receive_TMP_buffer[0]!='\0') {
  74.          
  75.     strncpy(receive_cmd,receive_TMP_buffer,5);
  76.     int cmp = strcmp(receive_cmd,"CONN!");
  77.  
  78.       if(cmp==0) {
  79.         lcd_goto_xy(1,1);
  80.             lcd_str("MEGJOTT!!");              
  81.         UART_send_buf("MEGJOTT\r\n");
  82.       }
  83.       else if(cmp>0) {
  84.             lcd_goto_xy(1,1);
  85.             lcd_str("KULDOTT NAGY!!");         
  86.             UART_send_buf("KULDOTT NAGY!!\r\n");
  87.             UART_send_buf(receive_cmd);  
  88.             UART_send_buf("\r\n");
  89.            } else {
  90.                 lcd_goto_xy(1,1);
  91.                 lcd_str("KULDOTT KICSI!!");            
  92.                 UART_send_buf("KULDOTT KICSI!!\r\n");
  93.                 UART_send_buf(receive_cmd);
  94.                 UART_send_buf("\r\n");   
  95.        
  96.              }           
  97.  
  98.          receive_cmd[0]='\0';
  99.          receive_TMP_buffer[0]='\0';
  100.                  
  101.    }
  102.   }    
  103.  }     
  104. }
  105.  
  106. ISR(SIG_USART_RECV)  {
  107.  receive = UDR0;
  108.  UART_add_byte_to_string(receive_TMP_buffer,receive);
  109.  }
A hozzászólás módosítva: Aug 24, 2015
(#) Kovidivi válasza szdani hozzászólására (») Aug 24, 2015 /
 
Te is "szoveg/n/r" küldesz, szerintem ahhoz kellene hasonlítanod!
(#) szdani válasza Kovidivi hozzászólására (») Aug 25, 2015 / 1
 
Igen, mert azzal záram le az adatot, viszont úgy másolom át hogy azt lehagyom. De meg megpróbálom anélkül.
(#) Jaedong válasza szdani hozzászólására (») Aug 25, 2015 / 1
 
Szia! Sietek, úgyhogy nem tudtam végignézni az egészet, viszont egy szembeötlő baki: ha a receive_cmd-be vársz 5 karakteres stringet ( CONN!), akkor abba nem fér bele a lezáró nulla (6 eleműnek kéne lennie). Szerintem ha ezt kijavítod jó lesz.

+Ha strncpynél a forrásstringből átmásolt n bájtban nincs benne a lezáró nulla, akkor azt manuálisan kell utána hozzáaadnod (ha nincs már alapból benne a tömbben).
(#) szdani válasza Jaedong hozzászólására (») Aug 25, 2015 /
 
Köszönöm szépen jó lett Ha úgy ellenőrzöm hogy benne van a \r\n akkor máris jó.
(#) szdani hozzászólása Aug 27, 2015 /
 
Tovább akartam fejleszteni, hogy 2 kontrollert kötök össze RS485-ös buszra. Úgy már nem megy át adat. Csak a küldés engedélyező lábát vezérlem, a fogadás az állandó. 115200 BAUDRATE és
MAX 487 és kb. 20cm vezeték. Mit ronthattam el?
A hozzászólás módosítva: Aug 27, 2015

RS485.jpg
    
(#) Gj válasza csatti2 hozzászólására (») Aug 27, 2015 /
 
A ferriten kívül mindent megcsináltam, de így is csak 10-15 percig bírja.
Mit lehet még tenni vele?

Az 50pF-os kondik a 27Ohm-os ellenállások melyik oldalára mennek? (PC felőli, vagy az mcp2200 felőli oldal)
(#) csatti2 válasza Gj hozzászólására (») Aug 27, 2015 /
 
Megnéztem egy referecia áramkört a microchip oldalán, ott nem használtak ehhez az IChez külön soros ellenállást és kondikat (valószinűleg tehát ennél az IC-nél nem szükségesek).
Egyébként a te oldaladon kellenének.
Még mindig három méteres kábelt használsz? Próbáltad rövidebbel?
A ferrit a nagyfrekvenciás zajok csökkentésért felelős. Elég hasznos tud lenni.
Tudnál feltenni egy fotót az áramkörödről?
(#) Gj válasza csatti2 hozzászólására (») Aug 27, 2015 /
 
Prototípus, szóval felesleges leszólni a kinézetet, nem ilyen lesz a végső.
nem volt kis méretű ellenállásom 27Ohm-osból, csak nagydarab 5-10W-osak, így 2x2db 15Ohm-osat használtam.

A kábel kb. 3 méter, de már árnyékolt.

Ha a képből nem látszana, a "104" feliratú 100nF-es kondi a fekete és piros kábelek között van (nem a UART kábelek, hanem az USB + és - feszek között).
A hozzászólás módosítva: Aug 27, 2015
(#) csatti2 válasza Gj hozzászólására (») Aug 27, 2015 /
 
Hmm, ez rosszabbul néz ki mint amire számítottam. Őszintén szólva kicsit csodálkozom rajta, hogy egyáltalán működik. Ezzel semmit sem tudsz csinálni azon kívűl, hogy végre megcsinálod rendesen... Az USB egy viszonylag nagy sebességű kommunikácó (felejtsd el, hogy milyen baudrate-t használsz, azzal csak szimulálsz egy másik eszközt, az USB-hoz tényleges köze nincs), ha szkóppal megnéznéd mi lesz azokból a szép négyszögjelekből, hát meglepődnél.
Építsd át az USB részt úgy, hogy lehetőleg minnél közelebb legyen a D- és D+ csatlakozás az IC lábához. Vedd ki az ellenállásokat és kondikat a D- D+ vonalból (az árnyékolásét ne bántsd). Vagy vegyél egy kész USB-USART átalakítót, a prototípushoz elég lesz az is.
(#) ThompsoN válasza Gj hozzászólására (») Aug 27, 2015 /
 
Ha nem ilyen lesz a végső megoldás, akkor lehet, hogy érdemes lenne elgondolkodni azon, hogy olyan AVR-t veszel, amiben van beépített USB. Idén nyáron szereztem be egy Atmega32U4-es modellt (pontosabban egy Pololu A-Star Mini LV-t, de a gyári bootloadert nem használom), tökéletesen működik az USB kommunikáció is, és nem kell plusz IC.
(#) Gj válasza csatti2 hozzászólására (») Aug 27, 2015 /
 
A 100nF-os kondi maradjon?
(#) csatti2 válasza Gj hozzászólására (») Aug 27, 2015 /
 
A tápon? Persze.
(#) Sipy hozzászólása Aug 27, 2015 /
 
Sziasztok, vettem egy USBasp programozót és összekötöttem egy ATtiny2313-al. Egy villogtató programmal akartam kipróbálni amit bascom alatt írtam és azzal is próbáltam beletölteni a programot de azt írta hogy nem találja a villogó.eep fájlt. Igaza van mert én sem találtam. Mit csináltam rosszul?
(#) dc001 válasza szdani hozzászólására (») Aug 27, 2015 /
 
"Mit ronthattam el?"

Mindkét vonalat Vcc-re húztad. Az egyiket Vcc-re a másikat GND kell húzni. Ha jól emlékszem az A-t Vcc-re a B-t pedig GND-re (de lehet, hogy fordítva). A lényeg, hogy a MAX kimenetén olyan szint legyen, ha nincs adó a buszon, mint a kontrollel soros kimenete, ha nem ad semmit.

Az RS485 úgy működik, A-B vonalon egymással ellentétes jelnek kell lennie. Hasonlóan mint az RS232-nél, ahol emlékeim szerint a 0=+12V az 1=-12V körül kellene lennie (ennél lehet alacsonyabb is). Az RS232-nél a 0V körüli érték nem értelmezett, itt pedig az A-B különbsége nem lehet 0V körül (pl.: A=5V;B=0V, akkor A-B=5V fordítva: A=0V;B=5V, akkor A-B=-5V).
(#) Gj válasza csatti2 hozzászólására (») Aug 27, 2015 /
 
Nem bír többet így sem. Most az árnyékolást leszámítva ott tartok, ahonnan elindultam. Csatolok képeket (a hátoldalát nem változtattam).
A hozzászólás módosítva: Aug 27, 2015
(#) Sipy válasza Sipy hozzászólására (») Aug 27, 2015 /
 
Na most már alakul. 160 bytes written to FLASH. Viszont a led nem villog akkor sem ha külön tápra kötöm
(#) Sipy hozzászólása Aug 27, 2015 /
 
Az AVR összes lábán 1.8 és 2.4V közötti feszültség van, ez normális? A led nem villog. Kicseréltem másikra a kontrollert de ugyanaz. Lehetséges hogy mindkettő rossz? Újak mind.
(#) pont válasza Sipy hozzászólására (») Aug 27, 2015 /
 
Egy fényképet, az összekötésekről légy-szíves.
(#) Sipy válasza pont hozzászólására (») Aug 27, 2015 /
 
Fényképet sajnos nem tölti fel nekem valamiért pedig korábban is akartam. Egyedül csak az 5V táp van bekötve meg a portd.0-ra egy led soros 1K ellenállással a föld felé. Kristály sincs rajta, az talán hiba lehet de szerintem magától be kellett volna indulni a belső oszcillátornak. Vagy nem? Próbálta 10K ellenállással a reset lábát felhúzni +5V-ra is és földre is de egyikre sem reagált.
(#) pont válasza Sipy hozzászólására (») Aug 27, 2015 /
 
A fénykép JPG és pár száz K-s legyen. A Bascom programot feltennéd?
(#) Sipy válasza pont hozzászólására (») Aug 27, 2015 /
 
Megpróbálok kisebb felbontású képet mindjárt. Ha sikerült akkor a bascom programot is úgy mert telefonról írok.
(#) Sipy hozzászólása Aug 27, 2015 /
 
Nem engedi feltölteni így sem
De beírom a bascom programot.

Config portd = Output
Do
Portd = 255
Waitms 50
Portd = 0
Waitms 50
Loop
End
(#) Sipy hozzászólása Aug 27, 2015 /
 
A led a reset láb alatti lábra van forrasztva.
(#) pont válasza Sipy hozzászólására (») Aug 27, 2015 /
 
Próbálj hosszabb időzítést, hogy tudj mérni bekapcsolja e a portot. Ha a led nincs fordítva, akkor még próbáld kisebb ellenállással (470) Ohm hátha nagyobb áramú fajta.

$regfile = "attiny2313.dat"
$crystal = 1000000


Config portd = Output
Do
Portd = 255
Waitms 500
Portd = 0
Waitms 500
Loop
End
(#) Sipy válasza pont hozzászólására (») Aug 28, 2015 /
 
Rendben megpróbálom, az időzítés az első programban ennyi volt nekem is. Elég hosszú vezeték van rajta csoportban, láttam hogy másnak az lehet a probléma. Lerövidítem hátha nekem is bezavar.
(#) Sipy hozzászólása Aug 28, 2015 /
 
Remélem sikerül már képet küldeni mert csak nem működik. Amikor megjelöltem a regfile-t akkor fel sem ismerte a kontrollert. A plusz vezeték egy usb csatlakozó, azon adok neki külső tápot.
(#) Sipy hozzászólása Aug 28, 2015 /
 
Szerencsére engedi már.
(#) Sipy hozzászólása Aug 28, 2015 /
 
A bascom pedig ezt írja. Először letöröltem mindent róla aztán megint beletöltöttem a programot és amikor ellenőriztem akkor hibát adott.

névtelen.JPG
    
Következő: »»   686 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem