volatile unsigned char UART0recv, UARTBuffer[BUFF_SIZE], UARTCount, UARTGet, rx_counter; A czy przypadkiem tylko pierwsza zmienna będzie volatile przy takiej deklaracji?
Było 10000000000000000000 razy: volatile int secPP; volatile int secDP;
Wpisać magiczne "volatile" volatile int sekunda=0;
volatile char * rxbufptrwrite; volatile char * rxbufptrread; To nie wskaźniki są volatile tylko obszar pamięci na który wskazują. Spróbuj: volatile char * volatile rxbufptrwrite; volatile char * volatile rxbufptrread; ale w tym przykładzie powinno też Ci wystarczyć char * volatile rxbufptrwrite; char * volatile rxbufptrread;
A może masz gdzieś funkcję obsługi tego przerwania? Dodano po 4 Dodam, że korzystam z programowego bufora cyklicznego, który w przerwaniach odbiera dane od UDR. Jedyne co mi przychodzi na myśl to to, że przerwanie tak szybko się wykona (odebranie danych do bufora i skasowanie flagi RXC), że część programu: while ( !(UCSRA & (1<<RXC)) ); nawet...
Czy z przerwania mogę zwrócić daną do głównego programu (jako dana globalna) ?? Tutaj znajdziesz odpowiedź: http://mikrokontrolery.blogspot.com/2011...
Wciśnięcie powoduje zwarcie do masy. Kolejne pytanie: Utworzyłem sobie 12 zmiennych typu volatile uint8_t Chce teraz stworzyć tablice 12 elementową, do której przypisze te zmienne i będę je sobie wybierał pętlą w programie. Niestety przy takiej inicjalizacji; volatile uint8_t tablica[11]={pwm1,pwm2,pwm3,pwm4,pwm5,pw...
Przerwań chyba gdzieś używasz- bo masz interrupt.h Ale w programie ich nie widać. Może to jednak nieśmiertelne volatile?
Witaj. 1. Nie znam VMLAB, ale czy prawidłowo definiujesz F_CPU? 2. Czy symulator nie potrzebuje osobnej definicji częstotliwości do prawidłowego określania czasów symulacji? Tak jest w symulatorze w Atmel Studio. 3. Volatile: http://mikrokontrolery.blogspot.com/2011... Posklejałeś ten program z kilku - no ale każdy kiedyś zaczyna...
Błąd masz tego rodzaju, że przypisanie do PORTD powoduje tylko ustawienie danego pinu (jeśli bit flash.f* jest ustawiony), nie ma możliwości skasowania bitu. Musiał byś przypisania zamienić na takie: PORTD = (PORTD & ~(1 << PD3)) | (flash.f05hz << PD3); lub: if(flash.f05hz) PORTD |= (1 << PD3);...
Tranzystor wyłaczy sie jeśli napięcie na bazie będzie większe niz 11,4V, czyli musi przekroczyc poziom napiecia emitera pomiejszony o około 0,6V. Najwyzsze napiecie na AVR to 5V wiec nie wyłaczy tranzystora. Łopatologicznie? Poszukaj, temat wałkowany niczym volatile
No, z tą szybkością to akurat nieprawda - inkrementacja zmiennej o dowolnej długości na CM zajmuje 3..4 instrukcje, to przy 50 MHz wciąż będzie na ogół szybciej niż jedna instrukcja na 8.bitowcu... ;)
Na końcu ISR powinieneś dać: [syntax=c]TCNT0 = 0;[/syntax] Co do tego: gFlags.pidTimer to o tym też nic nie wiadomo, czy napisałeś tam przy volatile? To tyle jeśli chodzi o domyślanie się na podstawie paru linijek kodu.
i jak zwykle, odpowiedz standardowa - volatile. ile razy bedzie musiala jeszcze pasc, aby forumowicze znajdywali ja w wyszukiwarce, a nie pytali o nia co chwile? 4\/3!!
Efekt jest dokładnie taki jak kod - o to mogę się założyć. Twój kod ma po prostu błędy i tyle, więc czego oczekujesz? Poza faktem braku volatile "tu i tam", to zerowanie tej flagi w przerwaniu masz, ale gdzie masz jej ustawianie? Nigdzie. 4\/3!!
Pozwólcie, że odświeżę i zapytam jak przekonwertować volatile uint8_t na char array[]?
void InitTimer(void) { TCCR1B |= _BV(CS11); TCCR1B |= _BV(WGM13); TCCR1B |= _BV(WGM12); TIMSK1 |= _BV(OCIE1B); OCR1B = 12500; } w tym trybie timer liczy do rejestru ICRn którego nigdzie nie ustawiasz, nie powinieneś ustawiać bitu WGM13 lub ustawić rejestr ICRn na większy od OCR1B (wtedy także musisz...
Zapewne LEDy są katodą do pina komputera? To wynika z tego, że piny portów po resecie są na 0 więc jeżeli ustawisz je jako wyjścia przy takim podłączeniu LED będą świecić. swoją drogą ustaw jako wyjście tylko pin PC0 Dodano po 1 Pewnie wiesz co to VOLATILE: http://mikrokontrolery.blogspot.com/2011...
Generalnie w takich przypadkach nota układu twoim przyjacielem. Poczytaj to co napisałem w komentarzach. [syntax=c]#include <avr/io.h> #include <avr/interrupt.h> int main(void) { uint8_t i = 0; DDRD = 0xff; //TCCR2A |= (1<<WGM21)|(1<<WGM22); // źle ten tryb jest zarezerwowany TCCR2A |= (1<<WGM21) // CTC //TCCR2A |= (1<<CS20)|(1<<CS21)|(1<&l...
kolejny temat, na ktory odpowiedzia jest 'volatile' - bylo o tym milion razy. 4\/3!!
Na szybko - na pewno "znak" powinien mieć w deklaracji słówko "volatile". Ale czy to wszystko? Przetestuj proszę. Razi też: #define F_CPU 1000000L Definiuje się to w środowisku IDE, którego używasz, a nie w kodzie. Dodano po 1 A jeszcze #define FOSC 1000000... Jedziesz na całego widzę ;)
Pamiętaj że sama transmisja też swoje trwa :) a poza tym nie pokazałeś funkcji printf (może ona bawi się w _delay_ms() ?) Zauważ również że przerwanie występuje niezależnie od transmisji, może dochodzić do takiej sytuacji ze raz przerwanie zmienić Ci wartość zmiennej tuż przed transmisją a raz tuż po niej i to spowoduje Twoje opóźnienia. Spróbuj blokować...
Niemniej jednak porady o BASCOMie również mi sie niezbyt podobają <: 4\/3!! A w zasadzie dlaczego? Język jak język-można wyrazić co się chce. Kompilatory bywają dobre lub gorsze. A te języki są "wysokiego poziomu abstrakcji". W C to co jest najlepsze to wskaźniki. Od razu mi się spodobały i oczywiste do zrozumienia. Bo to jest to co jest w procesorze....
Po niewielkich zmianach powinno działać też na Attiny85. Wrzucam kod dla Attiny85 (nie testowany; nie mam jak): [syntax=c]//############################... // SPWM implementation for Attiny85 // Clock frequency 8MHz internal clock oscillator // High Fuse: 0xFF, Low Fuse: 0xE2 // // Signals generated: // - SPWM...
Witaj, O volatile kolega słyszał? Jeśli nie, to czas poczytać: http://mikrokontrolery.blogspot.com/2011... Stosuj nowe funkcje obsługi przerwań ISR(), tym bardziej, że używasz nowe ich wektory: http://www.nongnu.org/avr-libc/user-manu...
Open your mind ;) uart_rx_buffer jest buforem odbioru. Wpis w PS jest poza tematem. Dotyczy dziwnego zachowania kompilatora i nie ma nic wspólnego z kodem z tematu. Poza tym uart_rx_buffer występuje w przerwaniu, dlatego volatile.
Nie bardzo mi się chce wnikać w przyczyny , więc wrzucę Twój zmodyfikowany kod: #include <avr/io.h> #include <avr/interrupt.h> #define PWM_out(value) OCR0 = value void delay(void){ volatile unsigned int i; for(i=5000;i;i--); } unsigned char pwm=127; int main(void) { DDRD = 0x00; PORTD = 0xFF;...
Niestety problem znów się pojawił: Program nie wchodzi do pętli while, gdzie warunek jest niespełniony dopiero po zatrzymaniu dopiero co ustawionego rejestru licznika, próbowałem jeszcze inny sposób, z bitami zmiennej flag ustawianymi w przerwaniach - do przerwania wchodzi, ale jak wróci do programu to nie wychodzi z pętli - tak jakby warunek był cały...
a tak poza tym jak chcesz inkrementować zmienną utworzoną wewnątrz timera która nie ma operatora volatile :?: O której zmiennej piszesz? O zmiennych: Tczas ? - nie ma takiej potrzeby, bo jest to zmienna używana tylko w przerwaniu dlatego deklaracja Static jest prawidłowa? i ? - w pierwszym kodzie wklejonym w tym temacie jest deklaracja volatile. Ale...
Obawiam sie że atmego bez naprawde sprytnie napisanego softu jest po prostu za słaba do tego celu. Wez po uwagę że float mnożenie to ok 2980 taktów zegara przy zmniennych typu volatile. Dla porównania. Dzielenie na pewno więcej. Dane dla innych typów danych: uint8 => 19 cycles uint16 => 24 cycles uint32 => 103 cycles int8 => 37 cycles int16 => 33 cycles...
A samo Buf też jest volatile? W TWDR mastera masz adres slave, bo po prostu master nic nie odebrał. Jesteś pewien, że slawe wchodzi w tryb slave transmit (ST) wielobajtowy? Masz sprzętowy debugger? Jakie są stany rejestru stanu na masterze i slave po kolejnych bajtach? Czysty kod przykładu, bez żadnych modyfikacji działa?
Może i działa, ale parę bzdur masz w tym kodzie. volatile w deklaracji argumentu funkcji jest bez sensu. Nikt tego argumentu nie ma szans zmienić. ATmega pracuje z zegarem max. 20 MHz, czyli okres 50 ns. Co ma niby robić ten delay ze ZMIENNOPOZYCYJNYM argumentem? Wykonanie jednej instrukcji przez ATmegę zajmie więcej czasu niż ma wynosić to opóźnienie....
Coś takiego znalazłem. Co prawda na Atiny ale można przerobić. [syntax=c]// // Talking to ultrasonic sensor HC-SR04 with an ATtiny84, and // sending distance data using serial communications. // // electronut.in // #include <avr/io.h> #include <string.h> #include <util/delay.h> #include <avr/interrupt.h> #define F_CPU 8000000...
Raczej nie wydłuży obsługi przerwania,a w przypadku uC wydajniejszych od ATmega wręcz ją skróci, bo modyfikacje zmiennej bez atrybutu volatile zajmują zwykle mniej czasu, niż modyfikacje stanu portu. Być może w AVR jest tak samo - to zależy i od sprzętu i do kompilatora. Po prostu te operacje, które wykonujesz na porcie, należy wykonywać na zmiennej...
Cześć, Magiczne słowo volatile: http://mikrokontrolery.blogspot.com/2011...
Przyczyna jest w tych linijkach Trzeba też pamiętać, że jeżeli zdefiniujemy tablicę n elementową i spróbujemy zapisać coś pod indeksem równym lub większym n to kompilator nie zgłosi błędu, ale skutkować to może nieprawidłowym działaniem programu.
Witam, mam taki kod programu: [syntax=c] #include <avr/io.h> #include <avr/eeprom.h> #include <avr/pgmspace.h> #include <avr/interrupt.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <util/delay.h> volatile uint8_t t1=5; volatile uint8_t t2=5; volatile uint8_t t3=5; volatile uint8_t...
Tak jest to dość istotne... Do pomiaru używany jest 16-bit'owy timer 1 (atmega162 ma dwa ale po takim ogólnym rzucie okiem na pdf wygląda na to, że nie ma różnic w konfiguracji)... Co przy częstotliwości taktowania 8MHz prescalerze 8 daje max ~65,5ms przy dokładności do 1us... Poniżej fragment kodu który mierzy czas trwania stanu wysokiego... ... volatile...
Hmm.. Wygląda to tak jakby nadajnik przestawał generować przebieg chwilę po uruchomieniu. A spróbuj może podłączyć równolegle z diodą nadawczą jakąś zwykłą diodę led - będziesz widział kiedy sygnał jest nadawany i kiedy przestaje. Druga rzecz, o której zapomniałem, a która może mieć wpływ - dopisz przed deklaracją zmiennych "volatile". volatile bool...
Ja to wiedziałem, ciekawe czy (at)tmf, notabene moderator, wiedział? Kolego, zanim zarzucisz komuś brak wiedzy w tym zakresie przeczytaj to co do tej pory napisał, w tym wypadku w swoich trzech książkach . Znajdziesz tam np. taki fragment: Dla zilustrowania użycia atrybutu naked przeanalizujemy następujący kod:
U mnie ta funkcja tyle że na unsigned long działa dobrze. Kompilowana pod IAR na MSP430. Dlaczego zmienna temp jest typu volatile? to chyba trochę bez sensu.
tak dokładnie jako uint_16_t czyli następująco: volatile uint16_t zmienna = 0; Zastanawiam się czy dobrze mam fusy ustawione - bo nic innego do głowy mi juz nie przychodzi.
Przykładowy program realizujący przedstawiony przeze mnie sposób. [syntax=c]#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "LCD.h" volatile unsigned int adcon = 0; ISR(TIMER0_OVF_vect) { static char st; if((st++)%2) { PORTB |= 1<<0; //pb0=0 PORTB &= ~(1<<1); //pb1=1 adcon = ADC; //odczyt...
Podpinam sie pod wątek. Sytuacja jest podobna. Oto kod, z ktorym nie moge sobie poradzic: #include <avr/io.h> #include <avr/interrupt.h> #define tau0 0; volatile unsigned char liczt=0; int main(void) { DDRD=0xFF; TIMSK=1<<TOIE0;//zezwolenie na przerwania od TC0 TCNT1=tau0; //wpisz stałą czasowa do TCNT0 TCCR0=0x07; //preskaler...
a więc w pliku HD44780.c przed każda następującą linią: LCD_E_PORT &= ~LCD_E dodałem : asm volatile("nop"); i dalej echo na wyswietlaczu :/
Najprościej to chyba tak: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #define TIMERSTART 6 volatile uint8_t FLAGA_50 = 0; volatile uint8_t FLAGA_1000 = 0; // funkcja obslugi przerwania TIMER0_OVF 8MHz / 64 * 250 wychodzi co 2ms // dla innego taktowania nalezy ustawic inny preskaler i/lub inne liczniki stawiania flag ISR(TIMER0_OVF_vect)...
http://www.nongnu.org/avr-libc/user-manu... Jeśli znasz trochę angielski to więcej Ci nie trzeba. Pozdrawiam ---------- chwila refleksji uint8_t i; asm volatile("mov %0,r20" :"=r" (i) : );
volatile char r1, g1, b1; Popraw deklarację tych 3 zmiennych , by wyglądała j/w i spróbuj ponownie ;) Piotrek
Kod piszę "na sucho", więc lepiej sprawdź czy działa.[syntax=c] #include <avr/interrupts.h> void timer0_init(void){ TCCR0 = _BV(CS02); //Mode 0, normal operation, prescaler 64 TIMSK |= _BV(TOIE0); //Timer/Counter0 Overflow Interrupt Enable } volatile unsigned long millis=0; volatile unsigned int okresy_migania_ledow[4] = {100,200,300,400}; ISR(TIMER0_OVF_vect)...
Rozumiem, że nie masz kodu źródłowego? ;) Jako osoba pisząca od wielu lat w C i mająca okazje w tym czasie obejrzeć wiele różnego rodzaju "wynalazków" powiem, że to co napisałeś w pierwszym poście może mieć sens. Tzn. spotkałem się z praktyką pisania kodu testującego flagę bitową w nst. sposób: if ((zmienna & STALA) == STALA) // na ustawienie...
optymalizacje mam na -OS, przestawić na O2 lub O3 ?? Przy tak minimalnym kodzie nic to nie zmieni Spróbuj z taką procedurą przerwania: [syntax=c]ISR(INT0_vect, ISR_NAKED) { asm volatile( "pushr24" "\n\t" "inr24, 0x09" "\n\t" "pushr0" "\n\t" "inr0, 0x3f" "\n\t" "pushr0" "\n\t" "pushr1" "\n\t" "pushr25" "\n\t" "pushr30" "\n\t" "pushr31" "\n\t" "ldsr25,...
Masz skasować flagę timera OCF0A [syntax=c]TIFR0 |= (1<<OCF0A); [/syntax] Możesz też włączyć przerwanie od Timera i zostawić pustą obsługę przerwania: [syntax=c] ISR (TIMER0_COMPA_vect, ISR_NAKED) { asm volatile("reti"); } [/syntax] Co spowoduje że cała obsługa przerwania sprowadzi się do RETI
witam, napisałem dwa kody na obsługę i2c master(atmega644p): /* * main.c * * Created on: 16 lut 2018 * Author: Mirosław Kardaś * web: www.atnel.pl */ #include <avr/io.h> #include <avr/interrupt.h> #include <string.h> #include <util/delay.h> #include <avr/wdt.h> #include <avr/pgmspace.h> #include <avr/eeprom.h>...
Cześć. Od około dwóch tygodni pracuję nad układem, którego głównym zadaniem jest jak najdokładniejszy pomiar czasu propagacji fali ultradźwiękowej między dwoma membranami piezoelektrycznymi. Układ jest zbudowany zgodnie ze schematem blokowym przedstawionym poniżej: http://obrazki.elektroda.pl/4225526900_1... Mikrokontroler to Atmega328...
Znalazłem conajmniej 2 błędy 1. Zadeklaruj enterRx jako volatile 2. Najpierw przypisujesz zmiennej enterRx wartość 1, a potem sprawdzasz czy zmienna ma wartość '1' (czyli 49) Spróbuj z tymi 2 zmianami i powinno zacząć chodzić Mirekk36, może on ma procedury LCD buforowane (ja zwykle takich używam), wtedy to niebyłby taki wielki błąd, ale wnikał niebędę.
Zmienna count powinna być volatile .
niemniej tak się nie dzieje a co się dzieje? Pomijając aspekt samej klawiatury, moje uwagi: 1. Jak chcesz być czytelny nie pisz WIE bo "NIE_WIE" ;) Kod jest po to by go czytać a nie rozszyfrowywać że to chodzi o WIERSZ ;) Pomine tutaj że mało domyślne te nazwy. 2. Osobiście nie używałbym modyfikacji portu, a jedynie wpisy typu [syntax=c]WIE=0b00001111;[/syntax]...
Dzieje się tak, ponieważ po wyjściu z ostatniej pętli czyścisz ekran, zmieniasz wartość zmiennej "a" i kończysz program - wracasz z funkcji main(). Zapomniałeś dodać pętlę nieskończoną, while(1). Rozpoczyna się ją za wstępną inicjalizacją. W twoim przypadku, będzie to za ekranem powitalnym. Skoro zaczynasz przygodę z programowaniem, to napiszę jeszcze...
1. Jaki jest cel stosowania: [syntax=c]#define PRZEBIEG_PETLI 8 #define us(num) (num/(PRZEBIEG_PETLI*(1/(F_CPU/1000000.0... inline void therm_delay(uint16_t delay) { while(delay--) { asm volatile("nop"); } } ... therm_delay(us(45));[/syntax] 2. Masz jakieś warningi?
kod ktory cie tak zaciekawil polega na tym: 1. jest sobie liczba 0x8000 2. chcesz zeby liczba ta traktowana byla jako adres, jak wiadomo adres = wskaznik, wiec dokonujesz rzutowania (u08*)liczba . od teraz dla kompilatora ten zapis bedzie dokladnie tym samym, co gdybys uzyl najzwyklejszej zmiennej wskaznikowej 3. skoro jest to zwykly wskaznik, to mozesz...
Funkcja czekająca na odpowiedz powinna być odporna na brak jakiekolwiek odpowiedzi. W przypadku braku odpowiedzi z modemu Twój kod się "zapetli". Jak wygląda kod usr0_getc()? Nie widzę związku między ISR a tą funkcją. Zakładam również, ze flagi (flagGotLine i pozostałe) zadeklarowales jako volatile. Postaraj się zaimplementować pkt. 4 z mojej poprzedniej...
1. Komentuj bogato swój własny kod, bo sam się w nim pogubisz, a i nam trudniej analizować, nie wiedząc co chcesz w danym fragmencie zrobić. 2. deklarujesz zmienną globalną cod , w przerwaniu nadajesz jej wartość cod=code : 2a. ale jej nie używasz w pętli głównej i nigdzie indziej - do czego więc jest? 2b. aby ją wykorzystać w pętli głównej cod musi...
...przy 10000HZ na LCD wyświetla 0666... No to prawie jak liczba szatana :) if(licznik==4) { T1=TCNT1; utoa( T1, bufor1, 10 ); lcd_gotoxy(3,0); lcd_puts(bufor1); TCNT1=0; } Widzę, że dodałeś pozycjonowanie kursora, żeby wynik za każdym razem był wyświetlany w tym samym miejscu wyświetlacza. Trzeba by jeszcze...
a co jest nie tak z pętlą while(1) bo nie mogę się dopatrzeć To, że jest pusta. Stan zmiennej flaga sprawdzasz tylko raz na początku programu, po czym zapętlasz go w pustej pętli. Poza tym sprawdzanie if(flaga=1) jest błędem, zapewne miało być if(flaga==1) - przeczytaj ostrzeżenia kompilatora generowane w czasie kompilacji.
Witam ponownie, próbowałem ogarnąć na początek funkcję eeprom_write_block. Oto fragment kodu: [syntax=c] typedef struct { // tu są chary, inty, tablice } TEngine; // zmienna w RAM volatile TEngine Engine; // Kopia będzie w EEPROM TEngine EEMEM eeEngine; // i gdzieś w kodzie dalej eeprom_write_block( &Engine, &eeEngine, sizeof(Engine) ); [/syntax] Przy...
Mam podobny problem z tą właśnie Atmega i programowym PWMem. Korzystam z CTC: [syntax=c] volatile uint8_t pwm1; DDRD=0xFF; //port D jako wyjscie TCCR2A |= (1<<WGM21); //CTC OCR2A = 200; ASSR |= (0<<AS2); TIMSK2 |= (0<<OCIE2A); [/syntax] Przerwanie: [syntax=c] ISR(TIMER2_OVF_vect) { static uint8_t cnt; if(cnt>=pwm1) PORTD |= (1<<PD2);...
Zanim zaczniesz używać asemblera wypadałoby poczytać trochę o tych komendach, co one oznaczają i jak ich używać. Jeżeli używasz assemblera jako wstawki w C, to mnemoniki typu MCUSR nic kompilatorowi nie mówią - musisz używać adresów. Z kolei komenda LDn ma z kilkanaście swoich wersji i powinieneś sprawdzić którą używasz i dlaczego. Jeśli już ładujesz...
Żeby na 100% nie było różnicy między badanymi stanami pinów podczas kolejnych badań oraz zapisu do rejestru, powinieneś tylko w jednym miejscu odczytać PIND i zapisać w zmiennej. Dopiero zmienną testować i gdy trzeba zapisać do tablicy. Sprawdź (pokaż) jak wygląda zawartość pliku .lss. Może trzeba powalczyć z instrukcją asm volatile("nop"), zeby program...
1. No ale tu blokujesz działanie całego procesora na niepotrzebnie długi czas. Przy 9600 nadanie 1 bajtu to wieczność. Procesor może wtedy zatańczyć kankana. I to 2 razy ;) 2. Bo można to szybciej zapisać jako: "\r\n" w ciągu formatującym wyświetlanie liczby (printf) 3. Oj wygląd się liczy. I to bardzo. Jak napiszesz program liczący tysiące linijek...
U mnie (Katowice) z DCF77 nie ma problemu, oczywiście zdarza się, że przez jakiś czas nie działa, ale przecież nie musi - wystarczy że złapie sygnał od czasu do czasu. Z tego co zauważyłem, to strasznie przeszkadza w odbiorze DCF77 komputer. Kiedy miałem zasilane układy przez USB to generalnie był problem, gdy je zasilałem osobno - z sieci lub z baterii...
1. Wszystkie zmienne modyfikowane w przerwaniu powinny być 'volatile'. 2. Po co wyłączać globalnie przerwania w procedurze obsługi przerwania? Poczytaj datasheet - one i tak są wyłączone. 3. Sugerowałbym nie żałować klawisza ENTER - kod, w którym w jednym wierszu jest kilka poleceń jest nieczytelny. 4. Rejestr UDR odczytujesz wielokrotnie w przerwaniu....
Przecież jak zadeklarujesz sobie zmienną pomiar jako zmienną globalną ulotną (volatile), to zawsze będziesz miał jej aktualną wartość wszędzie i nie musisz jej przecież nigdzie wysyłać z przerwania (zresztą się nie da).
#include <util/delay.h> #include <avr/io.h> void TWI_start(void); void TWI_repeated_start(void); void TWI_init_master(void); void TWI_write_address(unsigned char); void TWI_read_address(unsigned char); void TWI_write_data(uint8_t); void TWI_read_data(void); void TWI_stop(void);...
Nie chcę grać roli lokalnego guru (zwłaszcza korzystającego z cudzych stron WWW), ale widzę następujące błędy: F_CPU nie defniuje się w kodzie -> http://mikrokontrolery.blogspot.com/2011... Twoje zmienne używane w przerwaniu powinny być volatile -> http://mikrokontrolery.blogspot.com/2011... Nie...
Witam, Mam ten sam problem co kolega Beer Bear. Na zdjeciu otrzymuje to samo zaklocenie. Uzywam 2 pamieci rownoleglych po 64kB + zatrzask 573 . Caloscia steruje ATMEGA 64 16MHz. Wyeliminowalem częśc sprzętową, ponieważ sprawdziłem wszystkie połączenia na płytce kilka razy i nie znalazłem żadnego blędu. Wiec pomyślalem sobie ze wina moze tkwic w kodzie...
Witam. Zmontowałem przed chwilą i sprawdzone. Zostaje tylko pozbycie się drgań styków klawisza. [syntax=c]#define F_CPU 16000000UL // Atmega644 #include <avr/io.h> /*biblioteka avr*/ #include <string.h> /*biblioteka napisy*/ #include <stdio.h> /*biblioteka podstawowa C*/ #include <stdlib.h> /*biblioteka C*/ #include <stdbool.h>...
Ja na poważnie. Ale miałem na myśli coś innego. Nie kontrolę czasu ale stałość czasu. C nie gwarantuje wygenerowania konkretnego kodu a jedynie kodu o konkretnej funkcjonalności. Co z miejsca zaprzecza temu że czas wykonywania będzie stały. BASCOM gwarantuje wygenerowanie konkretnego kodu. Co oczywiście jest nieoptymalne, ale gwarantuje określony czas...
1. Volatile: http://mikrokontrolery.blogspot.com/2011... 2. Tryb asynchroniczny: 1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2. 2. Select clock source by setting AS2 as appropriate. 3. Write new values to TCNT2, OCR2, and TCCR2. 4. To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and TCR2UB...
Oto kod: Nie wiem, czy to może być przyczyną, ale taka deklaracja oznacza "wskaźnik na ulotne dane", a potrzebny jest "ulotny wskaźnik" czyli [syntax=c] char * volatile wskaznik; [/syntax] Oczywiście volatile z przodu też może być niezależnie.
1. Do tego co napisał Fredy wyżej: http://mikrokontrolery.blogspot.com/2011... 2. Zmienną akt_wyswietlacz zdefiniuj sobie jako lokalną statyczną w funkcji przerwania. 3. F_CPU definiuj w opcjach, a nie w kodzie: http://mikrokontrolery.blogspot.com/2011... 4. W jakim celu zerujesz TCNT2 w przerwaniu...
A jesteś pewien, że właściwie ustawiłeś typ procesora? A BTW, czego się spodziewasz po "asm volatile("SEI");"? Powinno być "__asm__ __volatile__ ("sei" ::: "memory")". To oczyewiście nie jest przyczyna zawieszania się programu, ale na przysżłość pozwoli ci uniknąć paru problemów.
Te wyprowadzenia są podłączone pod kontroler pamięci (zob. str. 33 w MMnet02_pl.pdf). Też się męczę z tym LCD. On jest podłączony w trybie mapowania pamięci, na rejestrach 0xff04 i 0xff05. Próbowałem z Nut/OS przez driver hd44780_bus jak również przez lcdlibrary i nic. Zastanawiam się, czy dobrze ustawiam rejestr MMnet02_CONF, ale sprawdzałem różne...
Zmienna sek powinna być volatile: http://mikrokontrolery.blogspot.com/2011... ssek natomiast zrób statyczną w funkcji przerwania: unsigned tam gdzie liczby nie będą ze znakiem. Wprawdzie ani godziny, ani minuty, czy też sekundy nie przekroczą maksymalnych ich wartości, ale porządek warto mieć. Poza tym, taktujesz swój mikrokontroler...
Powrócę jeszcze do tematu. Timery programowe to objaśnił Mirekk36 w swojej książce oraz artykułach i wideo poradnikach, bardzo dobrze je się stosuje. Jest to proste, wystarczy ustawić jakiś timer w tryb CTC i wywoływać przerwanie co jakiś zamierzony czas (stosuje około 10ms). F_CPU/Prescaler/100 Zaokrągloną wartość wpisujemy do rejestru OCRx. W przerwaniu...
Już prawie masz to, co trzeba. Jeśli zmienna timer zwiększana jest co 20 ms, to zrób: if (timer >= 2) { /* albo więcej, ale 40ms to i tak dużo */ uint8_t zmiany = debounce(); /* wersja freddiego */ timer = 0; if (zmiany & _BV(PIN_MINUS)) servonumber -= 1; if (zmiany & _BV(PIN_PLUS)) servonumber...
Zmienna liczba musi być typu volatile, to tak na szybko. ;) Dodano po 13 No zrób jakieś opóźnienia, żeby wyeliminować drgania styków.
Witam. Od paru godzin męczę się z niedziałającym USARTem na atmedze32. Na atmedze88 wszystko śmiga jak ma więc przejściówka USB<->RS232 jest ok. Brak zimnych lutów na płytce. Kwarc zewnętrzny (ustawiony jako EXTHIFXTALRES_258CK_4MS - przy czym nie wiem czy tak ma być dla kwarcu 16MHz). Kod zamieszczam poniżej: [syntax=c] /* * softPWM.c * * Created:...
Odpowiednie typedefy są w nagłówku stdint.h Co do podziału pomiędzy przerwanie a program główny to pewnie zapomniałeś modyfikatora volatile przy deklaracji zmiennych, które są dzielone pomiędzy przerwaniem a main(). Co do "tablicy czujników": struct czujnik { uint8_t adres; /* do wyboru czujnika na szynie */ uint8_t ileProbek; uint16_t probki[ROZMIAR];...
Czy zmienną counter (inkrementowaną prawdopodobnie w przerwaniu) masz zadeklarowaną jako volatile ? Jeśli nie, to kompilator najprawdopodobniej zoptymalizuje porównanie (counter<=nr) jako warunek zawsze spełniony lub zawsze nie spełniony do momentu zakończenia pętli, w której przecież żadna ze zmiennych porównywanych się nie zmienia.
dzień dobroci. #include "konfig.h" // sugerowalbym nazwy typu "config.h" volatile char Temp; // skoro odbierasz znak, to po co komu 16-bitow? ISR(USART_RXC_vect) { //Temp=0; // zbedne Temp=UDR; if (Temp=='1') // przynajmniej wiadomo o co chodzi { UDR=Temp; //echo tego co wysyla } } int main(void)...
Interesuje mnie jak napisać kod korzystając z makra RAMEND które od razu uzupełni rejestr Y. No przecież już go napisałeś: static void __start(void){ asm volatile ( "out __SP_L__, %A0" "\n\t" "out __SP_H__, %B0" "\n\t" "clr __zero_reg__" "\n\t" "out __SREG__, __zero_reg__"...
Treść linku - Znam i rozumiem. uC to ATmega 16. Jeżeli możesz, wytłumacz mi : cytat od "tmf"" "#define PIN(x) (*(&x - 2)) To jest błędne. Powinno być volatile, ....." Co miał na myśli, jak z tego zrobić volatile. Czy chodziło Mu o to: unsigned char volatile zmienna; zmienna=PINA; lub zmienna=PIN(PORTA); a dalej, już w kodzie: }while(zmienna...
Witam. Próbuję przesłać i odebrać znak pomiędzy atmega128 a putty. ATmega taktowana kwarcem 14.7456MHz. Korzystam z przejściówki USB<->RS232 (z atmega32 działa). RXD/TXD skrosowane. KOD: uart.c : [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #include <stdlib.h> #include "uart.h" volatile char c_in; // odebrany znak...
Oprócz tego co napisał janbernat: czy zmienna second jest zadeklarowana jako volatile? Jeżeli nie to tak zrób, a tutaj jest wytłumaczenie dlaczego: http://mikrokontrolery.blogspot.com/2011... Pokazuj cały swój program, a nie tylko wycinki.
Witam. Realizuję prosty projekt generatora wideo na VGA opartego o Atmegę1284p - obraz jest generowany z pamięci RAM dosyć chałupniczą metodą: aby osiągnąć rozdzielczość 53x240 pikseli (!) tworzę 53 tablice (rozdzielczość pozioma) uint8 o rozmiarze 240 wpisów (rozdzielczość pionowa) a następnie ustawiam PORTC po kolei każdą tablicą o indeksie linii....
A może coś takiego [syntax=c] typedef struct{ u08 b0:1; u08 b1:1; u08 b2:1; u08 b3:1; u08 b4:1; u08 b5:1; u08 b6:1; u08 b7:1; } volatile IO; IO * const pora=(IO*)&PORTA; #define PORTA0 pora->b0 #define PORTA1 pora->b1 ... [/syntax]
(at)szelus Oczywiście DE i RE są połączone razem (zworka). Inaczej nie miałbym transmisji zwrotnej albo trzeba by podłączyć do dwóch różnych pinów ATMEGI. Zwłoki po przełączeniu się z nadawania na odbiór (20ms) i odwrotnie wydają się być i tak przydługie - jakby były przeznaczone dla starej elektroniki analogowej... ;-) Testowałem też różne odstępy...
Uwagi: Przerwanie timera, a nie ADC, z powodów, o których wyżej była mowa. Wszystkie dane poza wektorem wyników powinny być zadeklarowane wewnątrz procediury obsługi przerwania timera z atrybutem static, a nie volatile, a wektor wartości ADMUX - jako static const. Z kolei zadeklarowanie wektora wyników z atrybutem volatile (hiperpoprawnie) powoduje...
Nie mam jak określić dokladnie częstotliwości, ale mniej więcej z przełożenia czujnika w skrzyni myślę że od 0 do 4000 impulsów na sekundę ( tak orientacyjnie), szerokość impulsu to 1/16 obrotu czujnika. Znalazlem dziś jedyny projekt, z którego mógłbym wziąć podstawę, ponieważ jest to obrotomierz czyli też zliczanie impulsów i podobno działa na takiej...
Kurdę no przerwanie jest wywoływane co 310us a to jest bardzoooo wiele cykli zegara na to by mogła się wykonać cała pętla while, cały czas nie rozumiem czemu na atmega 16 działa a na atmega128 nie chce działać :/ sprawdzałem bity ustawiające timer i przerwanie, są one takie same dla mega 16 i 128 więc nie wiem w czym jest problem :( Ten program działa...
atmega volatile atmega volatile funkcja atmega volatile zmienna
czujnik oparów benzyny miernik uszkodzony pomiar rezystancji creative glosnosc
traktorek silnik briggs traktorek silnik briggs
Brak grzania wody w zmywarce Siemens - przyczyny Passat B6 2.0 TDI - Check Engine i przerywanie silnika