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   653 / 837
(#) k3gy3tl3n hozzászólása Márc 6, 2015 /
 
Sziasztok, nincs valakinek véletlenül watchdog példaprogramja, amiben szimplán interrup-ként van használva és nem indítja újra az MCU-t? Az igaz, hogy a watchdog a hozzá tartozó fuse bit nélkül is használható? Azt olvastam, hogy ha csak simán interrupt-ként akarom használni nem kell beállítani a fuse bitjét. Egyszerűen csak szeretnék egy interruptot csinálni 1sec tétlenség után timer elpazarlása nélkül
(#) zombee hozzászólása Márc 6, 2015 /
 
Mindenki a WinAVR-t szapulja, pedig (szerintem) már mindenki az utódját(AVR Toolchain) használja,
még a megrögzött fanatikus Studio4-et használók is (mint pl. én). A Toolchain-ról mi a véleményetek?
A hozzászólás módosítva: Márc 6, 2015
(#) wbt válasza k3gy3tl3n hozzászólására (») Márc 6, 2015 /
 
Szia!
Kiollózva egy régi programomból (Basic):
  1. Config Watchdog = 2048
  2. On Watchdog Wd_int   ISR helye
  3. Wdtcr = &B01001000  Ez a lényeg!
  4.  
  5. Aztán START WD.
  6.  
  7. Wd_int:  WD ISR eleje
  8. Set Wdtcr.6                                                 'WDIE=ENABLE
  9. ..........................


Remélem beválik.

JAni
(#) wbt hozzászólása Márc 6, 2015 /
 
Programból lehet bizergálni az AVR FUSE-biteket?
Most bootloader-el megy a frissítés, de van ISP is rajta, amin keresztül bárki
kiolvashatja a teljes programot. No, most letilthatom az ISP-t, de akkor
egy rossz húzással (tipikusan bootloader vacakol) kizárhatom magam.
Arra gondoltam, hogy soroson beküldött azonosítóval ki tudnám-e nyitni újra
az ISP-t, hogy a sok kísérletezgetés közben ne gyártsak téglákat vagy csúzli lövedék alapanyagot.
Ja, a bootloader csak feltölteni tud, semmi mást. ATmega328P az áldozat.

JAni
(#) TavIR-AVR válasza wbt hozzászólására (») Márc 6, 2015 /
 
Ne az ISP-t tiltsd le. A locknál a read/verify programot.
Így ChipeErase-vel ISP-vel még tudod programozni. Ja a LPM/SPM Boot disable-t állítsd be, hogy a bootloadert nehogy felülírd bootloaderes programozáskor
(#) k3gy3tl3n válasza wbt hozzászólására (») Márc 6, 2015 /
 
Köszi, de nekem C mintakód kéne
(#) wbt válasza TavIR-AVR hozzászólására (») Márc 6, 2015 /
 
1db barom vagyok...
Hát ja, akkor ISP-n az Erase működik, csak kiolvasni nem tudja. Szóval,ha jól értem,
bármilyen gond esetén nem lesz tégla a cucc (max visszahozzák élesztésre).
Köszönöm! Azonnal ki is próbálom!
Amilyen aljas vagyok, még arra gondoltam,hogy mondjuk az ISP valamelyik lábát összekötöm/lekötöm GND-re stb. Bekapcsolás után megnézem az állapotát, ha
nincs rendben (mert rádugta az a saját ISP-jét és rájött, hogy el kell távolítani egy ellenállást pl.) akkor bevések gyorsan az eepromba valamit, amitől borul a működés (majd valamikor).
Tehát az EEPROM-ot is analizálnia kell, hogy melyik adat küldi el az erdőbe a cuccot néha.
Vagy valami ilyesmi...

JAni
(#) dc001 válasza k3gy3tl3n hozzászólására (») Márc 6, 2015 / 1
 
Szerintem a WDTCSR regiszter WDIE bitje kell neked (a WDP2 és WDP1 adja a 1sec-et):

  1. int main(void)
  2. {
  3. ...
  4. cli();
  5. WDTCSR = (1<<WDCE) | (1<<WDE);
  6. WDTCSR = (1<<WDIE) | (1<<WDP2) | (1<<WDP1);
  7. sei();
  8. ...
  9. }
  10.  
  11. ISR (WDT_vect)
  12. {
  13. ...
  14. }


+ ha jól tudom, a WTDON fuse bit-et nem szabad beállítani, mert akkor a WDTCSR-től függetlenül mindig reset lesz. A fenti részlet atmega168-ra van.
(#) k3gy3tl3n válasza dc001 hozzászólására (») Márc 6, 2015 / 1
 
Köszi a segítséget! Elkészült a program, annyit csinál, hogy 4sec (kicsit több) tétlenség után ellövi a watchdogot és lefut a kód az ISR() függvényben,viszont nem reseteli a kontrollert, megmaradnak a változók aktuális értékei. A WDTON fuse bitet nem kell beállítani hogy működjön. Gyakorlatilag timer overflow interrupt csak timer elpazarlása nélkül, az kell a PWM-hez A kód mega48-on fut szépen.
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4. #include <avr/wdt.h>        // Supplied Watch Dog Timer Macros
  5. #include <avr/sleep.h>      // Supplied AVR Sleep Macros
  6.  
  7. #define LED 0
  8. #define LED_OFF() PORTB &= ~(1<<LED)
  9. #define LED_ON() PORTB |= (1<<LED)
  10.  
  11. void PORT_INIT(void){
  12.  DDRB |= (1<<LED);
  13. }
  14.  
  15. void main(void)
  16. {
  17.         PORT_INIT();
  18.        
  19.         if(MCUSR & _BV(WDRF)){            // If a reset was caused by the Watchdog Timer...
  20.                 MCUSR &= ~_BV(WDRF);                 // Clear the WDT reset flag
  21.                 WDTCSR |= (_BV(WDCE) | _BV(WDE));   // Enable the WD Change Bit
  22.                 WDTCSR = 0x00;                      // Disable the WDT
  23.         }
  24.  
  25.         int count = 100;
  26.        
  27.         while(1){
  28.                 /*----------- Set up Watch Dog Timer for Inactivity -----------*/
  29.                 cli();
  30.                 WDTCSR |= (_BV(WDCE) | _BV(WDE));   // Enable the WD Change Bit
  31.                 WDTCSR =   _BV(WDIE) |              // Enable WDT Interrupt
  32.                                    _BV(WDP3);   // Set Timeout to ~4 seconds -y ezt 16ms-től 8s-ig állíthatjuk, uC adatlapjáról kinézhető
  33.                 sei();
  34.                
  35.                 //Jöhet a kód, ami megakaszthatja a program futását. Ha ez több mint 4s beavatkozunk az ISR(WDT_vect) függvényben
  36.                 for(int i=0;i<count;i++){_delay_ms(40);} //count értéke egyre nő, így egyre többet várunk míg el nem robban a watchdog
  37.                 count++;
  38.                 WDTCSR =0x00; //ha elértünk idáig kireseteljük a watchdogot, minden ok, számolhat előről
  39.                 /*-------------------------------------------------------------*/
  40.         }
  41. }
  42.  
  43. ISR(WDT_vect) //ez fut le ha ellőttük a watchdog-ot (5x felvillan a led)
  44. {
  45. sleep_disable();
  46.         uint8_t i,j;
  47.         for(i=0;i<5;i++){
  48.                 for(j=0;j<4;j++){_delay_ms(30);}
  49.                 LED_ON();
  50.                 for(j=0;j<4;j++){_delay_ms(30);}
  51.                 LED_OFF();
  52.         }
  53. sleep_enable();
  54. }
A hozzászólás módosítva: Márc 6, 2015
(#) Droot hozzászólása Márc 7, 2015 /
 
A MAX31855-nél meg van szabva, hogy mennyi időd kell várni két kiolvasás között, vagy folyamatosan is történhet a kiolvasás?
Azt írja az adatlap, hogy Temperature Conversion Time 100ms tipikusan, én most 100ms-onként olvasom ki. Ha 50ms-ra csökkentem akkor is csak 100ms-onként lesz új adat?
(#) vzoole válasza Droot hozzászólására (») Márc 7, 2015 /
 
Ha jól emlékszem, ha túl gyakran olvasod ki, akkor nem tud mérni, és nem jó adatokat küld folyamatosan.
(#) Droot válasza vzoole hozzászólására (») Márc 7, 2015 /
 
Próbáltam 50ms-onként is kiolvasni, nem volt gond. Maradok 100ms-nál, de jobban is megoldhatták volna. Úgy logikus hogy ha 100m-sonként mér és 25ms-onként olvasom akkor minden 4. kiolvasásnál kapok új értéket.
(#) killbill válasza Droot hozzászólására (») Márc 7, 2015 /
 
Idézet:
„Úgy logikus hogy ha 100m-sonként mér és 25ms-onként olvasom akkor minden 4. kiolvasásnál kapok új értéket.”

Az adatlapbol csak az derul ki (szamomra), hogy a hatterben csinalja a merest, es hogy a CS high allapota alatt frissiti a kimeneti regisztert. Az nem derult ki az adatlapbol, hogy ciklikusan mér vagy mondjuk a CS low->high (vagy high->low) hatasara kezdi el a merest. Viszont az biztos, hogy ha egyszer 100ms-ig mer, akkor inkabb nem kellene piszkalni az SPI-n, mert attol csak maximum zajojsabb lesz a meres. Minek kiolvasni valamit belole, amirol tudod, hogy ugysem valtozik?
(#) Droot válasza killbill hozzászólására (») Márc 7, 2015 /
 
Ez így van, ezért is döntöttem a 100ms mellett.

Viszont érdekes anomáliába ütköztem. A méréstőlteljesen független.

  1. /* portok inicializálása */
  2.         DDRD = (1<<PD0) | (1<<PD1) | (1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD6) | (1<<PD7);
  3.         DDRC = 0xFF;
  4.         DDRB = (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB5) | (1<<PB7);
  5.  
  6.         //felhúzó ellenállások
  7.         PORTB |= (1<<PB0) | (1<<PB6);
  8.         PORTD |= (1<<PD2);
  9.  
  10.         //SlaveSelect magas szint -> inaktív
  11.         PORTB |= (1<<PB1);
  12.  
  13.         /* mérés */
  14.         TCCR0 = (1<<CS01); //8-as prescaler, 1,024ms @ 2MHz
  15.         TIMSK |= (1<<TOIE0);
  16.  
  17.         /* páka OCR1B PWM */
  18.         TCCR1A = (1<<COM1B1) | (1<<WGM11) | (1<<WGM12); //non-inverting mód, fast pwm 9 bit
  19.         TCCR1B = (1<<CS12); //256-os prescaler 30,51Hz @ 2MHz
  20.         OCR1B = 0;
  21.        
  22.         /* Timer2 */
  23.         TCCR2 = (1<<CS21);      //8-as előosztó, 976Hz @ 2MHz
  24.         TIMSK |= (1<<TOIE2); //engedélyezzük
  25.  
  26.         /* INT0 engedélyezése */
  27.         MCUCR = (1<<ISC01) | (1<<ISC00);
  28.         GIMSK |= (1<<INT0); //INT0 engedélyezés
  29.  
  30.         /* SPI beállítás */
  31.         SPCR = (1<<SPE) | (1<<MSTR); //SPI engedélyezés, master mód, fsck 500KHz @ 2MHz
  32.  
  33.         wdt_enable(WDTO_60MS);
  34.  
  35.         sei(); //megszakításokat engedélyezzük


A fenti inicializálás után, ha az OCR1B-nek bármilyen olyan értéket adok, ami nem 0, az AVR teljesen megzakkan. Olyan lábak kerülnek magas szintbe, amelyeket már beállítottam alacsony szintre. És a main-em is tök üres, csak a wdt reset van benne.
(#) k3gy3tl3n hozzászólása Márc 7, 2015 /
 
Sziasztok, van ötletetek miért nem fut le az interrupt függvény a következő kódban:
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <avr/pgmspace.h>
  4. #include <util/delay.h>
  5.  
  6. /* RFM12B INTERFACE */
  7. #define SCK 5 // SPI clock
  8. #define SDO 4 // SPI Data output (RFM12B side)
  9. #define SDI 3 // SPI Data input (RFM12B side)
  10. #define CS 2 // SPI SS (chip select)
  11. #define NIRQ 2 // (PORTD)
  12. /* IO CONTROL */
  13. #define HI(x) PORTB |= (1<<(x))
  14. #define LO(x) PORTB &= ~(1<<(x))
  15. #define WAIT_NIRQ_LOW() while(PIND&(1<<NIRQ))
  16. /* LED */
  17. #define LED 0
  18. #define LED_OFF() PORTD &= ~(1<<LED)
  19. #define LED_ON() PORTD |= (1<<LED)
  20. #define BAUDRATE 25 // 19200 at 8MHz
  21.  
  22. void delay_ms(uint16_t ms)
  23. {
  24.     while ( ms )
  25.     {
  26.         _delay_ms(1);
  27.         ms--;
  28.     }
  29. }
  30.  
  31. void portInit() {
  32.         HI(CS);
  33.         HI(SDI);
  34.         LO(SCK);
  35.  
  36.         DDRB = (1<<CS) | (1<<SDI) | (1<<SCK) | (1<<PB0) | (1<<PB1);
  37.         DDRD = (1<<LED) | (1<<PD7)| (1<<PD6) | (1<<PD5) | (1<<PD1); //set output pins
  38.  
  39.         PORTB &= ~((1<<PB0) | (1<<PB1));
  40.         PORTD &= ~((1<<PD7) | (1<<PD6) | (1<<PD5));
  41. }
  42.  
  43. unsigned int writeCmd(unsigned int cmd) {
  44.         unsigned char i;
  45.         unsigned int recv;
  46.         recv = 0;
  47.         LO(SCK);
  48.         LO(CS);
  49.         for(i=0; i<16; i++){
  50.                 if(cmd&0x8000) HI(SDI); else LO(SDI);
  51.                 HI(SCK);
  52.                 recv<<=1;
  53.                 if( PINB&(1<<SDO) ){
  54.                         recv|=0x0001;
  55.                 }
  56.                 LO(SCK);
  57.                 cmd<<=1;
  58.         }
  59.         HI(CS);
  60.         return recv;
  61. }
  62.  
  63. void rfInit() {
  64.         writeCmd(0x80D7); //EL,EF,433band,12.0pF
  65.         writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC (bug was here)
  66.         writeCmd(0xA640); //freq select
  67.         writeCmd(0xC647); //4.8kbps
  68.         writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
  69.         writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
  70.         writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR (FIFO level = 8)
  71.         writeCmd(0xCED4); //SYNC=2DD4;
  72.         writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
  73.         writeCmd(0x9850); //!mp,90kHz,MAX OUT
  74.         writeCmd(0xCC17); //!OB1,!OB0, LPX,!ddy,DDIT,BW0
  75.         writeCmd(0xE000); //NOT USE
  76.         writeCmd(0xC800); //NOT USE
  77.         writeCmd(0xC040); //1.66MHz,2.2V
  78. }
  79.  
  80. unsigned char rfRecv() {
  81.         unsigned int data;
  82.         while(1) {
  83.                 data = writeCmd(0x0000);
  84.                 if ( (data&0x8000) ) {
  85.                         data = writeCmd(0xB000);
  86.                         return (data&0x00FF);
  87.                 }
  88.         }
  89. }
  90.  
  91. void FIFOReset() {
  92.         writeCmd(0xCA81);
  93.         writeCmd(0xCA83);
  94. }
  95.  
  96. int stepcount=0;
  97.  
  98.  
  99. void fwd(){
  100.                
  101.                         PORTD |= (1<<PD6);
  102.                         delay_ms(10);
  103.                         PORTD &= ~(1<<PD6);  
  104.                
  105.            
  106.                
  107.                         PORTB |= (1<<PB0);
  108.                         delay_ms(10);
  109.                         PORTB &= ~(1<<PB0);  
  110.                
  111.  
  112.                
  113.                         PORTD |= (1<<PD7);
  114.                         delay_ms(10);
  115.                         PORTD &= ~(1<<PD7);
  116.                
  117.  
  118.                
  119.                         PORTD |= (1<<PD5);
  120.                         delay_ms(10);
  121.                         PORTD &= ~(1<<PD5);
  122.                
  123. }
  124.  
  125. void Turn(uint8_t dir)
  126. {
  127.         if(dir==1 && stepcount<100)//left
  128.         {
  129.                 if(stepcount % 4 == 0){
  130.                         PORTD |= (1<<PD6);
  131.                         delay_ms(10);
  132.                         PORTD &= ~(1<<PD6);  
  133.                 }
  134.            
  135.                 if(stepcount % 4 == 1 || stepcount % 4 == -3){
  136.                         PORTB |= (1<<PB0);
  137.                         delay_ms(10);
  138.                         PORTB &= ~(1<<PB0);  
  139.                 }
  140.  
  141.                 if(stepcount % 4 == 2 || stepcount % 4 == -2){
  142.                         PORTD |= (1<<PD7);
  143.                         delay_ms(10);
  144.                         PORTD &= ~(1<<PD7);
  145.                 }
  146.  
  147.                  if(stepcount % 4 == 3 || stepcount % 4 == -1){
  148.                         PORTD |= (1<<PD5);
  149.                         delay_ms(10);
  150.                         PORTD &= ~(1<<PD5);
  151.                 }
  152.                 stepcount++;
  153.         }
  154.        
  155.         if(dir==2 && stepcount > -100)//right
  156.         {
  157.                
  158.                 if(stepcount % 4 == 3 || stepcount % 4 == -1){
  159.                         PORTD |= (1<<PD5);
  160.                         delay_ms(10);
  161.                         PORTD &= ~(1<<PD5);  
  162.                 }
  163.            
  164.                 if(stepcount % 4 == 2 || stepcount % 4 == -2){
  165.                         PORTD |= (1<<PD7);
  166.                         delay_ms(10);
  167.                         PORTD &= ~(1<<PD7);  
  168.                 }
  169.  
  170.                
  171.                 if(stepcount % 4 == 1 || stepcount % 4 == -3){
  172.                         PORTB |= (1<<PB0);
  173.                         delay_ms(10);
  174.                         PORTB &= ~(1<<PB0);
  175.                 }
  176.  
  177.                 if(stepcount % 4 == 0){
  178.                         PORTD |= (1<<PD6);
  179.                         delay_ms(10);
  180.                         PORTD &= ~(1<<PD6);
  181.                 }
  182.                 stepcount--;
  183.         }
  184.        
  185.         if(dir==0 && stepcount > 0)
  186.         {
  187.                 if(stepcount % 4 == 3 || stepcount % 4 == -1){
  188.                         PORTD |= (1<<PD5);
  189.                         delay_ms(10);
  190.                         PORTD &= ~(1<<PD5);  
  191.                 }
  192.            
  193.                 if(stepcount % 4 == 2 || stepcount % 4 == -2){
  194.                         PORTD |= (1<<PD7);
  195.                         delay_ms(10);
  196.                         PORTD &= ~(1<<PD7);  
  197.                 }
  198.  
  199.                
  200.                 if(stepcount % 4 == 1 || stepcount % 4 == -3){
  201.                         PORTB |= (1<<PB0);
  202.                         delay_ms(10);
  203.                         PORTB &= ~(1<<PB0);
  204.                 }
  205.  
  206.                 if(stepcount % 4 == 0){
  207.                         PORTD |= (1<<PD6);
  208.                         delay_ms(10);
  209.                         PORTD &= ~(1<<PD6);
  210.                 }
  211.                 stepcount--;   
  212.         }
  213.        
  214.         if(dir==0 && stepcount < 0)
  215.         {
  216.                 if(stepcount % 4 == 0){
  217.                         PORTD |= (1<<PD6);
  218.                         delay_ms(10);
  219.                         PORTD &= ~(1<<PD6);  
  220.                 }
  221.            
  222.                 if(stepcount % 4 == 1 || stepcount % 4 == -3){
  223.                         PORTB |= (1<<PB0);
  224.                         delay_ms(10);
  225.                         PORTB &= ~(1<<PB0);  
  226.                 }
  227.  
  228.                 if(stepcount % 4 == 2 || stepcount % 4 == -2){
  229.                         PORTD |= (1<<PD7);
  230.                         delay_ms(10);
  231.                         PORTD &= ~(1<<PD7);
  232.                 }
  233.  
  234.                  if(stepcount % 4 == 3 || stepcount % 4 == -1){
  235.                         PORTD |= (1<<PD5);
  236.                         delay_ms(10);
  237.                         PORTD &= ~(1<<PD5);
  238.                 }
  239.                 stepcount++;   
  240.         }
  241.  
  242. }
  243.  
  244. int receive_error=1;
  245.  
  246. uint8_t man_decode(uint16_t enc) {
  247.     int odd_byte,even_byte;
  248.  
  249.     odd_byte=(int)(enc>>8);
  250.     if((odd_byte&0xAA)^((~odd_byte&0x55)<<1)) {
  251.         receive_error=1;
  252.         return(0);
  253.     } else odd_byte&=0xAA;
  254.  
  255.     even_byte=(int)enc;
  256.     if((even_byte&0x55)^((~even_byte&0xAA)>>1)) {
  257.         receive_error=1;
  258.         return(0);
  259.     } else even_byte&=0x55;
  260.  
  261.     receive_error=0;
  262.     return(odd_byte|even_byte);
  263. }
  264.  
  265. void pwm_on_pb1()
  266. {
  267.     DDRB |= (1 << DDB1); // PB1 is now an output
  268.     OCR1A = 0; //kitoltesi tenyezo
  269.     TCCR1A |= (1 << COM1A1); // set none-inverting mode
  270.     TCCR1A |= (1 << WGM12) | (0 << WGM11) | (1 << WGM10); // 8 bit fast pwm
  271.         TCCR1B |= (1 << CS10); // prescaler = 1
  272.    
  273. }
  274.  
  275. volatile uint8_t recv =0x00;
  276. volatile uint8_t count=0;
  277.  
  278. int main(void) {
  279.         int i=0;
  280.         unsigned char data, step;
  281.         uint16_t encoded=0xFFFF;
  282.         uint8_t motspeed = 0x00, dir = 0x00;
  283.         step = 0x00;
  284.         LED_OFF();
  285.         portInit();
  286.         rfInit();
  287.         FIFOReset();
  288.         pwm_on_pb1();
  289.        
  290.         //motor beallitasa
  291.         PORTD &= ~(1<<PD5);
  292.         PORTD &= ~(1<<PD7);
  293.         PORTB &= ~(1<<PB0);
  294.         PORTD &= ~(1<<PD6);
  295.        
  296.         PORTD |= (1<<PD6);
  297.         delay_ms(10);
  298.         PORTD &= ~(1<<PD6);
  299.         PORTD |= (1<<PD6);
  300.         delay_ms(10);
  301.         PORTD &= ~(1<<PD6);
  302.                  
  303.         DDRD |= (1<<LED); //portinit
  304.  
  305.         //set interrupt
  306.     TIMSK |= (1 << TOIE0);
  307.     sei();         //enable interrupts
  308.     TCCR0 |= (1 << CS02) | (1 << CS00);
  309.                          
  310.         while(1) {
  311.        
  312.                 recv = rfRecv(); //ha leállítom az adót itt megakad a kód mégsem fut le az interrupt???!!!
  313.                 count=0; //reset count if data received
  314.                 motspeed = recv & 0b00011111;//also 5 bit a sebesseg -> max 31 lehet
  315.                 dir = recv >> 5; //felso 3 bit az irany
  316.                
  317.                 if(motspeed <= 31) //set motor speed
  318.                 {
  319.                         if((130/31 * motspeed) < 131)
  320.                         {
  321.                                 OCR1A=130/31 * motspeed;
  322.                         }
  323.                        
  324.                         i++;
  325.                         if(i==100){
  326.                                 LED_ON();
  327.                         }
  328.                         if(i==200){
  329.                                 LED_OFF();
  330.                                 i=0;
  331.                         }                      
  332.                 }
  333.                
  334.                 Turn(dir);
  335.                
  336.                 if(dir & 0b00000100){ //start motor2
  337.                         PORTD |= (1<<PD1);
  338.                 }else{ // stopmotor2
  339.                         PORTD &= ~(1<<PD1);
  340.                 }
  341.  
  342.  
  343.                 FIFOReset();
  344.         }
  345.         return 0;
  346. }
  347.  
  348. ISR (TIMER0_OVF_vect)  // timer0 overflow interrupt
  349. {
  350.     // event to be exicuted every 32ms here
  351.         count++;
  352.         if(count>=10)
  353.         {
  354.                 OCR1A=0x00; //mot speed=0
  355.                 recv=0x00;
  356.                 count=0;
  357.         }
  358. }


Ha csak ennyiből áll a kódmegy szépen:
  1. // this code sets up a timer0 for 4ms @ 16Mhz clock cycle
  2. // an interrupt is triggered each time the interval occurs.
  3. #include <avr/io.h>
  4. #include <avr/interrupt.h>
  5. #include <util/delay.h>
  6.  
  7. #define LED 6
  8. #define LED_OFF() PORTD &= ~(1<<LED)
  9. #define LED_ON() PORTD |= (1<<LED)
  10.  
  11. volatile uint8_t count=0;
  12.  
  13.  
  14. int main(void)
  15. {
  16.         DDRD |= (1<<LED); //portinit
  17.  
  18.     TIMSK |= (1 << TOIE0);
  19.     sei();         //enable interrupts
  20.     TCCR0 |= (1 << CS02) | (1 << CS00);
  21.  
  22.     while (1)
  23.     {
  24.  
  25.     }
  26. }
  27.  
  28.  
  29. ISR (TIMER0_OVF_vect)  // timer0 overflow interrupt
  30. {
  31.     // event to be exicuted every 4ms here
  32.         count++;
  33.         if(count>=10)
  34.         {
  35.                 LED_ON();
  36.                 count=0;
  37.         }
  38. }


Az interrupt része ugyan az, mégis miért nem megy az első kódban? Arra gyanakszom hogy a pwm_on_pb1() függvényben valamit elállítok.... Agyvérzés!
(#) k3gy3tl3n válasza k3gy3tl3n hozzászólására (») Márc 7, 2015 /
 
Megoldódott, rosszul volt beállítva a uc típusa az AVR studióban....
(#) killbill válasza Droot hozzászólására (») Márc 7, 2015 /
 
Mar regen nem AVR-eztem, inkabb nem okoskodom bele a timer-be. A PWM kimenet meghajt valamit? Arra gondolok, hogy lehet-e esetleg HW problema. Mondjuk zaj, amit a kapcsolt kimenet okoz.
(#) Droot válasza killbill hozzászólására (») Márc 7, 2015 /
 
Én is erre gyanakodtam. Egy FET-et kapcsol, amin 2A folyik át, soros ellenállással, ami 100r, a Gate-t pedig lehúzom a testhez egy 1K-s ellenállással. Ha csak simán a PD2-t kapcsolom ki/be akkor működik. De ha az 1ms-os timer-be rakom (PORTB ^=(1<<PB2), akkor szintén előjön a hiba.
(#) zsozsoX válasza csabeszq hozzászólására (») Márc 8, 2015 /
 
Kizárásos alapon arra jutottam, hogy a relékkel 230voltot kapcsolók és az zavarja az SPI-t ha nincs 230v vagy leveszem a fogyasztót (kis teljesítményű motor) akkor tökéletesen megy. Ha rajta van meg zavarodik mindig akkor amikor kapcsolna ki vagy be.Esetleg valami ötlet? A nyákon amennyire lehetett nincs össze keverve a gyenge áram a 230-al. A logikai analizátorhoz milyen szoftver ajánlasz? Segítséget köszönöm.
(#) 06smici válasza zsozsoX hozzászólására (») Márc 8, 2015 /
 
Az SPI eléggé érzékeny zajokra. Próbáld meg minél rövidebben vezetni és egy földet is érdemes behúzni jelvezetékek mellé. Ha lehet akkor a tából is külön húzd a földet a logikai résznek és a reléhez. A relét pedig minnél távolabb rakd tőle.

Én így csinálnám, de ha valakinek ezen kívül vannak egyébb megoldásai is, azt én is szívesen meghallgatnám (elolvasnám).
(#) Tambi hozzászólása Márc 9, 2015 /
 
Kedves barátim! Meglehetősen kezdő vagyok AVR-témában, ezért segítségeteket kérem; Hogyan lehet egy *.txt file-t átkonvertálni *.hex-be? BASCOM-t használok, és persze a txt-t nem lehet beletölteni... Mellékelem a HE oldalin megjelent 500 MHz-s frekimérő hex-ét, ami txt. Hogyan tovább???


Köszönettel; Tambi

48p.hex.txt
    
(#) Zsolt2 válasza Tambi hozzászólására (») Márc 9, 2015 / 2
 
Torold ki a vegerol a ".txt" kiterjesztest.
A hozzászólás módosítva: Márc 9, 2015

48p.hex
    
(#) Drone hozzászólása Márc 9, 2015 /
 
Sziasztok!
Ezt szeretném megépíteni Tv-b-gone .
Csak valaki segít felprogramozni az avr chipet(ATtiny85v-10 ) ?
Itt van amit bele kéne égetni.(tvbgone.hex)
A hozzászólás módosítva: Márc 9, 2015
(#) Max26 hozzászólása Márc 11, 2015 /
 
Sziasztok!

Az égetőm tönkrement, mert a fuse bitet helytelenül használtam. Lehetséges, hogy az AVR, amit akkor vele programoztam az is tönkremehetett? Egy másik égetővel nem sikerül felprogramozni.
(#) k3gy3tl3n válasza Max26 hozzászólására (») Márc 11, 2015 /
 
Szia, fuse bitek átírásával max az éppen programozott mikrokontrollert tudtad megölni, a programozót nem hinném. Amikor másik égetővel sem tudtad felprogramozni nem gontoltad, hogy mindkét égetőd jó csak a mikrokontrollerből zártad ki magad? Mondjuk beállítottál külső kristályt de nincs rajta, vagy kikapcsoltad a SPIEN bitet.
(#) dbase hozzászólása Márc 11, 2015 /
 
Van egy nem általam írt program atmega8 16PU val használt led 7szegmenses driver. Egyre nehezebb beszereznem, helyettesíthetem -e:
-ATMEGA8A-PU, ATMEGA8L-8PU, pl?
(#) Max26 válasza k3gy3tl3n hozzászólására (») Márc 12, 2015 /
 
Akkor már értem miért nem lehet olvasni/írni. Igen, a SPIEN bit ki van kapcsolva, de hogy lehet visszakapcsolni?
(#) k3gy3tl3n válasza Max26 hozzászólására (») Márc 12, 2015 /
 
Ugye ezzel kikapcsoltad az SPI-t amin keresztül programozni lehet. Nemrég tettem fel ide egy párhuzamos magas feszültségű programozót kapcsolással és kóddal (pár oldallal visszább), esetleg JTAG-gel ha van a kontrollereden és van programozód ami tudja, vagy elfelejted azt a mikrokontrollert.
(#) kapu48 válasza Max26 hozzászólására (») Márc 12, 2015 /
 
Ez most elégé furcsa kijelentés!: ”Igen, a SPIEN bit ki van kapcsolva!”
Ezt hogyan tudtad megállapítani?

Mivel ha tényleg így van, akkor nem tudnád beolvasni a fusebíttek állapotát sem!
(#) csabeszq válasza k3gy3tl3n hozzászólására (») Márc 12, 2015 /
 
Hát igen, csak az a baj, hogy többe kerül megépíteni, mint új IC-t venni.

Persze akinek sok ideje van, összedughatja breadboardon.
Következő: »»   653 / 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