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...
OK. Jestem teraz prawie pewien gdzie leży problem. Otóż ten program VMLAB jest kiepskim symulatorem i nie za bardzo łapie operator volatile. Program zawiesza się na pętli while() w funkcji licz(), ignorując zupełnie przerwania. Jest to moim zdaniem wina tego symulatora. Układ fizyczny powinien działać. W wolnej chwili odpalę na symulatorze AS6. Edit:...
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)...
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...
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...
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...
...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...
#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);...
Dzień dobry, witam wszystkich. Mam problem z wstawką asemblerową do języka C. Programuję procesor atmega2560. Nie rozumiem dlaczego nie działa funkcja "asm volatile ("mov r21,MCUSR");". Chcę dzięki niej przenieść wartość rejestru mcusr do rejestru r21. Lista błędów w załączniku. Wiem, że one wprost mogą nie wskazywać na to, że ich źródłem jest ta linijka...
Cześć Załóżmy że mam pewną funkcje w której zwiększam zmienną a o jeden. W funkcji main wywołuje funkcje i wynik przypisuje do zmiennej b. Załóżmy też że mam przerwanie które też zwiększa a o jeden. W celu optymalizacji operacje na zmiennej a będą wykonywane w wolnym rejestrze i przy wyjściu z funkcji wynik rejestru zapiszemy do zmiennej załóżmy że...
O coś takiego mi chodziło. Teraz jest wywoływane przerwanie i procesor tylko je wykonuje ustawia flagę i ucieka do obsługi całego kodu. rxFlag i txFlag - musi być tylu volatile (int/char itp.) by była możliwość zmieniania ich wartości w przerwaniu. Masz tak ?? Sprawdzałeś w symulatorze jak program skacze po funkcjach ?? Zrób tak. skopiuj to wszystko...
A co ma wielopoziomowe menu do przerwań? Pewnie że zrobisz bez nich zobacz u mnie jak jest zrobione też z wyborem funkcji i zmaną parametrów a bez przerwań i na impulsatorze. Co do zmiennych globalnych to raczej nie wskazane jest ich stosowanie. To coś jak z goto czasem ciężko wykryć błąd nawet jak ją zadeklarujesz jako volatile. Lepiej rób to normalnie...
(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...
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...
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...
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....
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.
Powód jest bardzo prosty: zmniejszenie zmiennej w pamięci nie jest operacją atomową. Co prawda za każdym razem następuje odczytanie zmiennej, zmniejszenie jej a następnie zapis, to jeśli przerwanie wystąpi pomiędzy odczytem a zapisem, to utracisz zmianę dokonaną w przerwaniu. W przypadku gdy przerwanie i funkcja main konkurują o jeden zasób, musisz...
Witam ponownie mam pytanie do kolegów a mianowicie nie działa mi funkcja dekodująca liczbę na kod BCD Mam funkcje void DZIES_BCD(int a) { volatile signed char i; volatile char buffer[6]; for(i=0,buffer[5]=0; a; a/=10,i++) { buffer[i]= a%10 + '0'; pozycja=i; } for(; i<=6; i++) { buffer[i] = ' '; } i teraz jak wywołam funkcje i za "a" podam liczbę...
Mam problem z przełączaniem bitów Założenia programu są następujące Program przez określony czas ma włączyć 2 diody oznaczone Pompka1 i Pompka2 oraz wyłączyć Napowietrzacz po upływie czasu ma przełączyć tz: wyłączyć Pompka1 i Pompka2 oraz włączyć Napowietrzacz po upływie drugiego czasu znowu ma przełączyć. Niestety program nie działa dobrze Diody działają...
Ale ty nigdzi emasz nie czekać na koniec konwersji, ani w przerwaniu (zgroza), ani poza nim. W przerwaniu zapisujesz do B wynik z ADC i startujesz kolejny pomiar. W kolejnym przerwnaiu znowu odczytujesz ADC i startujesz kolejny. Jeśli odstęp pomiędzy przerwaniami jest dłuższy niż czas konwersji to masz gwarancję, że ADC będzie gotowy i na nic czekać...
1. idealnie to analizujesz, dokładnie tak zapis 16bit może być podzielony przez przerwanie 2. leczy się to przez rzeczywiście wyłączenie przerwań ORAZ jako baza zadeklarowanie zmiennej jako volatile (wielu wierzy tylko magiczna moc volatile - błąd). Przywrócenie przerwań jest IMHO ładniejsze, jak ma charakter "push stan przerwań / disable / algorytm...
Nie wydaje mi sie aby byla taka koniecznosc.Ja sam jesli nie potrzebuje wiekszej rozdzielczosci uzywam do indeksowania unsigneg char coby zaoszczedzic na stosie.Byc moze znalazles jakiegos bug-a.Jedyne co mi przychodzi do glowy to porobic te zmienne typu volatile bo byc moze optymalizator sie wlacza do gry.Przeslij mi calego lss-a i podaj mi funkcje...
... Funkcja uart_putc działa z buforem cyklicznym. Takie coś: W/w testy a końcowa aplikacja to zupełnie inny poziom złożoności, że chodzi w przychylnych warunkach a we współbieżności nawala ,,, bosch to wiele rzeczy może się dziać. Tu null-terminated, tam nie, tam czas a tu nie itd... Twoje zeznania - bo na nich się opieram - silnie się kojarzą właśnie...
teraz masz: while((PIND&(1<<0)) && (PIND&(1<<1))) zwroc jednak uwage na to, ze DOKLADNIE to samo osiagniesz piszac: while(!( (~PIND) & ((1<<0) | (1<<1)) )) poniewasz wszystkie porty (wszystkie rejestry peryferyjne) zadeklarowane sa jako volatile, to w twoim kodzie MUSZA byc dwa odczyty, 2x AND, polaczenie...
witam. Pisze program do obsługi wyświetlacza LCD podłączonego do atmega16. Korzytsam z ksiażki A. Witkowski - Mikrokontrolery AVR - programowanie w j ęzyku C. przykłady zastosowań. i mam problem z plikiem który zawiera dwie funkcje lcd_write i lcd_write_nibble. wiem ze w tej książce są błędy i właśnie przy kompilowaniu wyskoakują mi dwa błędy "../lcd_write.c:62:...
Jak ustawiasz wartości początkowe jak np. wyjścia portu w rejestrze DDR to nie musisz robić |=, wystarczy =. Dobry zwyczaj to także robienie tabulacji (Tab) w funkcjach, czyli: [syntax=c]if(...) { for(...;...;...) { ... } }[/syntax] Jest kod bardziej czytelny, ale to takie spostrzeżenia :wink: A Twój problem to wpisanie przerwania do głównej funkcji...
Witam, próbuję przepisać program z Atmega8 na Atmega328P, z powodu małej pamięci Atmegi8, w programie wykorzystuje komunikacje USART. Program dla atmegi8: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #ifndef F_CPU #define F_CPU 1000000 #endif //set desired baud rate #define BAUDRATE 9600 //calculate...
Witam, mam problem z uruchomieniem programu do zliczania impulsów na T1 przez 1 sekundę. Wyświetla mi ciągle zero. Co źle ustawiłem z Timerami ?? Atmega 32 [syntax=c] #define F_CPU 1000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <hd44780.h> volatile unsigned char licznik = 0; //liczba...
Na pewno nie. :wink: ... jeśli używasz jednej zmiennej w naróżniejszych funkcjach to NIGDY podkreślam NIGDY nie trzeba specyfikatora VOLATILE. Trzeba trzeba. Jeśli prowadzisz dwa wątki równolegle czyli w multitaskingu. ;) jeszcze raz ci powiem - jeśli w tym multitaskingu (bo nie wiem co masz na myśli gdyż na procesorach 8-bitowych takich jak AVR nie...
Chyba trochę mały ten bufor na napis, w dodatku na stosie (pozostałe bufory tak samo). Zajeżdżasz sobie stos, więc nie dziw się, że się "cuda" dzieją.
No niekoniecznie wyjaśniłeś to o co pytałem ale powtórzyłeś to co pisałeś wyżej :) Czyli skoro funkcja 2 i 3 muszą być wykonywane z określoną częstotliwością to funkcja 1 i 4 raczej też skoro się uzupełniają nawzajem. To teraz, o ile Cię dobrze zrozumiałem postaram się pomóc. Nie wiem jakie masz wymagania, czyli z jaką częstotliwością te funkcje się...
Mam problem z odpowiednim obsłużeniem przerwania UARTa w ATMega644PA. Główny program wywołuje pewną funkcję, która robi jakieś operacje w pętli (załóżmy kilkadziesiąt razy). W przerwaniu UARTA: [syntax=c]static volatile bool FLAGA; ISR (UART0_RECEIVE_INTERRUPT) { /* .... */ //sprawdzenie czy został przesłany znak o kodzie ASCII = 3 if(UDR0 == 3) FLAGA...
Witam , otóż mam ostatnimi czasy dziwny problem z wywoływaniem funkcji , dołączanych plików źródłowych . Otóż przedstawię może problem w ten sposób : istnieje zmienna globalna używana w pliku xxx.C , zdefiniowana w tym pliku , której używają do obliczeń funkcje z pliku xxx.C . Dopóki wszystko się dzieje w obrębie pliku to jest o.k ( w sensie np , funkcja...
Potrzebuję wysyłać po RS232 wartości : volatile unsigned int narastanie,opadanie,które są tymczasowymi wartościami rejestru ICR1. Są to czasy pojawienia się odpowiednio zbocza narastającego i opadającego w trybie input capture,ktory próbuję od jakiegoś czasu uruchomić,ale beż efektów.W tym trybie chcę mierzyć czas trwania impulsów,jakie pojawiają się...
Racja Fredy, poza warunkiem nie powinno być flagi. Ustawienie volatile nie pomogło. Zamieszczam cały poprawiony kod: http://obrazki.elektroda.pl/6991735000_1... Brak mi pomysłów. Na terminal raczej bym nie stawiał. Funkcja printf jest standardowa i nie używa delay_ms. Teraz wygląda na to że timer nie dochodzi do 1 sekundy :( mumin_80
Cześć Mam taki kod ale niewiem w czym lezy problem czy możecie mi pomóc [syntax=c] //Dołączenie plików bibliotecznych #include<avr/io.h> #include<util/delay.h> #include<avr/interrupt.h> //Deklaracja funkcji void initialization(void); //Powołanie zmiennych globalnych wykorzystywanych w przerwaniu volatile uint8_t licznik_1; volatile...
Witam ! Tracąc dziesiątki godzin szukania w Internecie i dwa tygodnie prób i błędów z w/w LCD proszę o pomoc (i pokazanie błędu) Dołączam kod w http://obrazki.elektroda.pl/7865128700_1... [syntax=c][/syntax] // --------- sterownik LCD -> chyba NT7108/NT7107 (podobny do KS0108 ) --------------- // ATmega 128 + POWERTIP -> LCD PG12864...
Witam, stworzyłem projekt pomiaru pochylenia z wykorzystaniem akcelerometru ADXL345, ATmegi328p, wyświetlacz LCD. Co do schematu: Zasilanie atmegi filtrowane, akcelerometr podpięty do zasilania 3,3V(stabilizator LF33CV) zasilanie również filtrowane. ADXL (VCC i CS do 3,3V, SDA i SCL podłączone do rezystorów podciągających (7,5k), oraz do ATmegi PC4(SDA),...
Witam, Mam potencjalnie banalny problem z odczytem stringa z przerwania UART w pętli głównej programu. Kiedy przesyłam przez UART ciąg znaków są one odbierane, jednak przy próbie wyświetlenia ich na wyświetlaczu którego obsługa znajduje się w pętli głównej programu zamiast przesłanego stringu widzę losowe śmieci z pamięci (np. fragmenty danych poprzednio...
Witam! Mam prośbę o pomoc w poprawieniu kodu. Otóż mam zadeklarowane globalnie następujące zmienne: [syntax=c] volatile uint8_t x; volatile uint8_t recaive_complete; volatile uint8_t block_recaiver; volatile unsigned char bufferin[5]; [/syntax] W programie głównym mam 2 funkcje w pętli while. [syntax=c] while(1) { ReadKeypad(); ComRdFrame(); }[/syntax]...
Jak ma wyglądać funkcja która będzie włączać pewien proces migania diody led poprzez zetkniecie dwóch określonych pinów (np.PB5 i PB6) Chcę dodać że posiadam procesor Atmega 8L i program WinAVR. Funkcja migania diody LED wygląda tak: #include <avr/io.h> /***************************************... Definicje stałych ****************************************...
Kłania się pojęcie funkcji w języku C. setup() i loop() to też są funkcje. Do testowania stanu styków potrzeba tylko jednego przerwania timera, nic więcej. Po co mnożyć przerwania, czy to od zmiany stanu linii, czy to od dodatkowych timerów? Przy jednopoziomowym systemie przerwań, takim, jaki ma ATmega, o ile programista nie udziwnia nic na siłę, zmienna...
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...
Podlaczone: PA0 z przyciskiem z jednej strony PA1 z przyciskiem z drugiej strony Dlaczego tak dziwnie? void poczekaj(int ms) { volatile long unsigned int i; for(i=0;i<(ms*(F_CPU)... } Proponuję #include <util/delay.h> i zapoznanie się z funkcjami tam dostępnymi. if (bit_is_clear(PINA,PA0))...
No i znowu natknąłem się na jakiś dziwaczny problem. No i niestety zmienna dane nie zmienia swojej wartości podczas zmian napięcia na wejściu przetwornika ADC. Pokaż cały program, a w szczególności jak definiujesz zmienną dana . Użyłeś magicznego słowa volatile ?: http://mikrokontrolery.blogspot.com/2011... Funkcja wykonuje...
Witak wszystkich. Mam dziwny problem. Piszę obsługę RS-485 na Atmega328P. Testowo program jest bardzo prosty: #include "MPCM_Port_D.h" #include "USART.h" #include <util/delay.h> #ifndef F_CPU #define F_CPU 16000000UL #endif #include <avr/io.h> int main(void) { char a[]="abcde"; uart_master_init();...
To jest na avr tak dla pewności. Korzystam z biblioteki do HD44780 Radosława Kwiecienia. W funkcji [syntax=c] void LCD_WriteText(char * text) { while(*text) LCD_WriteData(*text++); }[/syntax] Potrzebuje dać char* i nie wiem jak do tego przekonwertować w najprostszy i najszybszy sposób. Jeszcze raz przypomne, chce by zmienna [syntax=c]volatile uint8_t[/syntax]...
oprócz zmiennej temp reszta czyli aż int0_flag jest volatile większa cześć kodu jest z słynnej ostatnio książki na forum. jeszcze nie zdążyłem za dużo pozmieniać [syntax=cpp] /* * main.c * * Created on: 2012-02-14 * Author: Jacek */ #include <avr/io.h> #include <stdlib.h> #include <avr/pgmspace.h> #include <avr/interrupt.h> #include...
Dobra. Kod prezentuje się następująco: to jest program w którym wszystko działa jak potrzeba: [syntax=cpp]//Data utworzenie: 20-09-2014 #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <avr/pgmspace.h> #include "MYUART/myuart.h" #include "MK_TERMINAL/mk_term.h" #define REF_256 (1<<REFS1)|(1<<REFS0)...
Cześć Coś mi kod do obsługi wyświetlacza LED niedziała. Czy moglibyście rzucić na to okiem. [syntax=c] #ifndef DISPLAY_LED_H_ #define DISPLAY_LED_H_ //Załączenie plików bibliotecznych #include<avr/io.h> #include<avr/pgmspace.h> #include<avr/interrupt.h> //Deklaracja zmiennych na których wykonywane są operacje w przerwaniu extern volatile...
Bo zapomniałeś o volatile. Dodano po 1 BTW, nie pokrywaj wektora BADISR_vect, szczególnie w taki sposób, że funkcja nic nie robi. Jak będziesz miał błąd w programie polegajacy na odblokowaniu przerwań do których nie masz handlerów to tego nigdy nie wykryjesz.
W pierwszej kolejności zadeklaruj zmienne seconds , minutes oraz hours jako volatile . Modyfikujesz ich wartość w przerwaniu i odczytujesz w programie głównym (w tym czasie może wystąpić przerwanie). secondsBuffer , minutesBuffer oraz hoursBuffer musi być co najmniej 3. Funkcja itoa() dodaje znak końca łańcucha tekstowego.
gaskoin - bzdura, poczytaj co robi volatile, bo już drugi raz wprowadzasz kogoś w błąd. Fir3man - najpierw kosmetyka - funkcja main jeśli nie masz OS, nie może się kończyć, stąd return 0 jest bez sensu. Poczytaj o atrybucie os_main. Ogólnie cały twój program jest do przeróbki. W procedurze obsługi ADC powinieneś odczytywać tylko wartość konwersji, wyświetlanie,...
SIGNAL(SIG_OVERFLOW0){ straznik = 0; cli(); } #1 Skoro 'straznik' przyjmuje tylko wartości 0 lub 1, to po co 16-bitowy typ 'int'. Wystarczy w zupełności 'uint8_t'. Ta sama uwaga dotyczy również zmiennych 'i' oraz 'j' w pętli 'for'. #2 Jeżeli używasz zmiennej 'straznik' zarówno wewnątrz procedury obsługi przerwania i w programie...
Tak jak w temacie coś mi kod nie działa proszę o pomoc gdzie leży błąd Ps wyświetla A ale B to nie wyświetla korzystam z 8Mhz [syntax=objc] #ifndef UART_H_ #define UART_H_ //Załączenie bibliotek systemowych #include<avr/io.h> #include<avr/interrupt.h> #include<util/delay.h> //Zadeklarowanie używania lub nie RS485 #define RS_485 0 #if...
Ustawiasz bit TOIE1 w rejestrze TIMSK, żeby włączyć przerwania przepełnienia, deklarujesz funkcję obsługi przerwania w sposób: volatile uint16_t pwm; //zmienna globalna do wartości pwm SIGNAL(TIMER2_OVF_vect) //funkcja wykona się po przepełnieniu timera 1. { OCR1A = pwm; } W swoim programie wpisujesz do zmiennej globalnej pwm wartość...
dokladnie jak to rozwinal przedmowca, gdzies masz bledy w kodzie. Kod zamieszczony w poście 3 jest poprawny. Oprócz generowania przerwań co 1 ms, jak już wspomniał kolega (at)ex-or , funkcja digitilWrite() każdorazowo blokuje i odblokowuje przerwania, co łącznie może skutkować tym, że kolejne iteracje loop() będą wykonywane w nieco różnym czasie. [syntax=c]void...
Udało mi się odtworzyć .wav 22050Hz. Jest bardzo fajnie, muzyczka gra w bardzo fajnej jakości, ALE... słyszę cały czas szum(pierdzenie), który jest jakby nałożony dodatkowo w muzyczce, taki odrębny szum. Jak go wyeliminować? Aktualnie kod odpowiedzialny za odtwarzanie przedstawia się tak: [syntax=c] // Konifguracja muzyczki void Music_Init() { DDRB...
W tym trybie timer po prostu zlicza impulsy zegarowe do niego doprowadzone, jeśli przekroczy zakres to zgłasza przerwanie overflow (nadmiaru) i rozpoczyna zliczanie od nowa. Funkcja obsługi tego przerwania zlicza je zwiększając liczniki f - przechowujący czas z rozdzielczością <1ms i m przechowujący liczbę milisekund. W programie należy korzystać...
wytłumacz mi kod bardziej szczegółowo. Oczywiście, chętnie to zrobię. Zacznijmy od początku: 1. `#define F_CPU 8000000UL` - To jest definicja częstotliwości taktowania mikrokontrolera. W tym przypadku wynosi ona 8 MHz. 2. `#include <avr/io.h>, #include <avr/interrupt.h>, #include <util/delay.h>` - To są biblioteki, które zawierają...
Witam w NOWYM ROKU! Układ złożony ale mam kolejny problem. Przerwanie od ADC Chcę w przerwaniu od ADC umieścić funkcję pomiar() jednak tam nie działa i nie wiem dlaczego. Jeśli funkcja pomiar() jest w main nie ma problemu, ale wtedy ADC nie jest właczony w trybie free running ani nie mam obsługi przerwania od ADC. Dla przypomnienia ATMEGA 8 + LM35 W...
Wydaje mi się że po prostu użyj jakieś flagi i zmiennej globalnej która zapamięta wartość PORTC w momencie wejścia do przerwania. Aby rzeczywiste wartość ta była zachowane użyj zmiennej volatile char to znaczy wchodząc do przerwania funkcja będzie wykonywana na tej zmiennej a nie na jej kopii.
Witam Po wielodniowym pisaniu oprogramowania mini sterownika do akwarium napotkałem dziwny problem, mianowicie. Utworzone menu zawierało 94 pozycje razem z podmenu zdefiniowane strukturze. Przechodzenie pomiędzy stanami realizowane jest enkoderem obsługiwanym w pętli głównej programi i ładnie działa. Problem pojawił się w chwili gdy postanowiłem dodać...
Witam. Napisałem program do pomiaru napięcia i pradu zmiennego, sygnaly doprowadzone na nozki ADC6 i ADC7, następnie chcęje spróbkować w przerwaniach z timera w trybie CTC (po64 próbki każdy), zatrzymaćna chwile przerwania, dokonać obliczeń, wyświetlić na lcd i "od nowa". Napisałem program, lecz nic nie oblicza prosiłbym o pomoc. Przepraszam z góry...
Witam. Nie mogę zmusić ATmegi128 do startowania z sekcji bootloadera. Mam ustawiony fusebit BOOTRST, do tego zaznaczone 'boot blocks 4096 words' (programator AVRprog z AVRstudio), czyli przeznaczam na sekcje bootloadera 8192 bajtow, czyli ta sekcja zaczyna się od 0x1E00. Chciałbym zaznaczyć, że ten bootloader, który chcę zrobić ma obsługiwać (samodzielnie)...
Okej, ogólnie to działa, wielkie dzięki za tamto. Mam jednak dalszy problem troszkę. Ogólnie chcę osiągnąć coś takiego, że wysyłam najpierw z Matlaba liczbę - jakąś flagę, po której uC wejdzie do odpowiedniej pętli. Po wejściu do tej pętli dopiero w niej ma odbierać wysłaną z Matlaba wartość. Czyli np. najpierw wysyłam liczbę równą 2 z Matlaba do uC....
Witam. Otóż mam taki problem ;) Dwa czujniki DS18b20 podłączone są do osobnych pinów Atmegi168, PINB0, PINB1. Chciałem to zrobić w ten sposób aby w przerwaniu ustawiana była flaga (co sekundę) która realizowana była w pętli głównej while(1), w ten sposób, aby co sekundę na zmianę wykonywany został convert oraz odczyt. Wydaje mi się, że wszystko zrobiłem...
Mam kolejne pytanie. Mając to że odczytuje PINB i PIND w przerwaniu (wstawka asemblerowa od michalko12) czy mogę wysłać dane powiedzmy od TAB1[0] do TAB1[10] przez TWI (i2c) do drugiego AVR ?? Czy nie będzie jakiegoś konfliktu z tą wstawką ASM?? TWI też wykorzystuje przerwania ?? Ewentualnie jak wysłać to do drugiego AVR (oprócz SPI i UART) bo mam do...
No właśnie cały czas wyświetlacz wyświetla mi 0. Wcześniej miałem 1000 ms opóźnienia ale to niczego nie zmieniało Dodano po 51 Podokładem trochę tych delay, ale wyniku na wyświetlaczu to nie zmieniło [syntax=c]#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #include...
Ile trwają procedury Measurement_DS18B20() oraz Measurement_SHT11()? Najlepiej pokaż też je. Takie coś się może dziać się w momencie, jeśli przerwanie od timera przychodzi w momencie działania funkcji dtostrf, jeśli uart działa z większą prękością to prawdopodobnie rzadziej trafia w tą funkcję. Najszybciej poprawić to można poprzez wprowadzenie jakiejś...
Cześć Temat wraca jak bumerang, chociaż mój problem polega raczej na brakach w C. Ale do rzeczy. Zapisuję i odczytuje dane z pamięci EEPROM. Wszystko działa. Ale ponieważ nie lubię warning-ów, to próbuję je wyczyścić. Są takie linijki w programie do odczytu kolejnych komórek z pamięci EEPROM i wrzucanie ich do odpowiednich zmiennych: [syntax=c] volatile...
Mam problem z odczytem danych z ADC po SPI. Nie jestem pewien czy napisany program jest poprawny dlatego prosiłbym o ewentualne wyszukanie błędu i jakieś naprowadzenie jak go poprawić. Na CH1 układu MCP3204 podaje napięcie z potencjometru. Dane chce wyświetlić w postaci liczby oddawanej przez ADC. GLCD działa i zmienne, które miały być wyświetlone działają,...
Witam, chciałbym zrobić robocika z silniczkami DC sterowane poprzez PWM. Niestety nie bardzo mam pojęcie jak to przerzucić na kod. Napisałem program, ale nie jestem pewny czy jest poprawny i czy moje myślenie w ogóle jest poprawne. Poniżej zamieszczam kod: [syntax=c] #define F_CPU 1000000L #include <avr/io.h> #define PRZOD 0x02 // (1<<PA1)...
Kombinuję by zrobić to na przerwaniach. Mam jednak problem. Pytania: 1) Jak sprawdzić czy bufor jest pusty? 2) Czym mogę wyczyścić bufor? Proszę o odpowiedź w postaci komend. Na razie jest tak: /***************** Funkcja odbioru znaku **********************/ volatile uint8_t uart_getc(void) { /* Sprawdzanie danych w buforze */ while (...
Witam mam kolejny problem z nieszczęsną atmega128. Napisałem program który działał na ATmega16 i chciałem go przenieść do atmega128 no i jest problem. Program w ogóle nie działa. W przerwaniu powinny się zwiększać wartości zmiennych. Niestety chyba nie zwiększają się :/ program wchodzi do przerwania bo wstawiłem tam naprzemienne ustawianie i kasowanie...
wszystkie funkcje, które napisałem są wykonywane w pętli while programu głównego main. W funkcjach liczników i przerwań ustawiam tylko flagi (wszystkie flagi deklarowane jako volatile), a w programie main sprawdzam, czy dana flaga jest ustawiona - jeśli jest, to wykonuję pewien fragment kodu i resetuję flagę. W funkcjach wywoływanych przez program main...
Witam! Zauważyłem dziwną rzecz. Jeśli w kodzie użyję funkcji _delay_ms z argumentem w postaci zmiennej, rozmiar skompilowanego kodu rozrasta się do około 40kB, zaś jeśli parametrem będzie bezpośrednio liczba, kod zajmuje 4kB. Co może być przyczyną? A, jeśli wywołuję tę funkcję z parametrem - zmienną, program nie działa prawidłowo. Pomóżcie, proszę!...
Mam problem z wyświetleniem bitmapy i nie wiem gdzie popełniam błąd. Konwertuję mapę na hexa prze programik Radzia i zapisuje ją jako plik .h. Tak to wygląda [syntax=c] const PROGMEM unsigned char obrazek[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,...
Witam serdecznie wszystkich!!! To mój pierwszy post. Od kilku dni walczę z modułami RF12B. Wydaje mi się że wszystko jest w porządku podpięte. Kod chyba też w porządku bo praktycznie taki jak wszystkie które pojawiły się w tym temacie. Tylko mam problem z weryfikacją tego co zostało przesłane. Nie mam możliwości podpięcia przez RS uK do mojego laptopa....
Po pierwsze powinieneś pisać kod bardziej po bożemu czyli stosować rzutowania. Po drugie Atmega 8 domyślnie pracuje na 8 znakach i nie trzeba tego ustawiać. Upewnij się że masz wyłączoną w komputerze kontrole przepływu. Funkcja _delay_ms przeznaczona jest do pisania własnych opóźnień bo sama jest ograniczona i 2000 jako argument nie przyjmie. Według...
No tak, te funkcje wyglądają w ten sposób: #define F_CPU 1000000 //1MHz zegar procesora #define CYCLES_PER_US ((F_CPU+500000)/1000000) //cpu cycles per microsecond void delay(unsigned int us) { unsigned int delay_loops; register unsigned int i; delay_loops = (us+3)/5*CYCLES_PER_US; for (i=0; i < delay_loops;...
Witam mam pytanie testuje funkcję wbudowaną atan2 () mam dwie zmienne typu int:ADC1, ADC2 dla przykładu atan2 (ADC2, ADC1)*(180/M_PI) = (510/ -471 )*(180/M_PI) daje mi wynik 132 --- błąd natomiast odwrotne działanie np. atan2 (ADC2, ADC1)*(180/M_PI) = ( -393 /504)*(180/M_PI) daje wynik prawidłowy -37^ atan2(-ADC2/-ADC1) *(180/M_PI) daje również wynik...
#include <inttypes.h> #include <avr/io.h> #include <stdio.h> #include <stdlib.h> #include <avr/iom32.h> #include <avr/interrupt.h> #include <string.h> #include <avr/pgmspace.h> #include <util/delay.h> #include "HD44780.h" //definicje zmiennych volatile int ms, s, m, h, znacznik; char buf[256];...
Witam. Chciałem napisać następujący program: Dane przesyłane są z komputera przez UART1, a następnie te dane chciałbym przesłać dalej, za pomocą UART0. Na razie połączyłem sobie, w UART0 RxD z TxD za pomocą rezystora 200Ohm (taki loopback do testów). Czyli jak na razie chciałem uzyskać następujący przepływ : komputer -> UART1 -> UART0 -> UART0...
Witam Trochę się poduczyłem z pomocą mojego kolegi Śmigła i zacząłem piać w AVR studio. Efektem tej pracy jest obsługa wyświetlacza LED (działa) i próba obsługi enkodera (ten niestety nie działa). Zamieszczam kawałek programu obsługi przerwań. Może ktoś z Was coś dostrzeże [syntax=c]ISR(INT0_vect) { //DDRD &= ~ (1<<PD2) | ~(1<<PD3);...
Witam Was mam taki problem i za bardzo nie mogę sobie poradzić. Chciałem przerzucić kod z atmegi8 na atmege32, który to obsługuje klawiaturę matrycową. Wcześniej kod pracował mi na jednym porcie, teraz jest na dwóch po kawałku. Na razie wyświetla liczbę 11 i nie reaguje. W kodzie dałem stosowne komentarze. Może jest tu jakiś prosty błąd ale nie mogę...
Witam Kod jak poniżej służy do zliczania czasu trwania jednego impulsu (ta funkcja działa prawidłowo) oraz do zliczania czasu (w celu zliczania ilości impulsów na jednostkę czasu). volatile unsigned char pomiar = 0; volatile uint32_t cw_impuls,impuls = 0; unsigned char sreg; float tc1; char czas[8]; void Inicjalizacja(void) { LCD_init();...
loocasm --> nie chodzi o to żeby wszystkie zmienne, których używa się w przerwaniu od razu deklarować jako volatile ale tylko te, które są jednocześnie używane zarówno w przerwaniu jak i w pozostałej części programu w różnych funkcjach. (nie do końca rozumiesz może jeszcze volatile) W tym konkretnym przypadku gdy zmienna overflow_tmp jest używana tylko...
Jestem elektronikiem i choć od prawie roku (z przerwami ) powoli zagłębiam się w temat programowania na własne potrzeby AVR-ów nadal nie potrafię zastosować wielu pożytecznych funkcji co powoduje że napisanie programu do zarządzania i monitorowania napięć i prądów w układzie zasilacz,akumulator 12V,oświetlenie LED oraz sterowanie przez nastawny dwukanałowy...
Witam, wiem że w sieci jest 1*e^6 lub więcej gotowych liczników impulsów, lecz ja chciałbym mieć pełną kontrolę nad moim kodem, a nie kopiować bezmyślnie. Tak więc sprawa tyczy się zliczania impulsów 5V od obrotów i prędkości w motocyklu. Do tego celu chcę wykorzystać układ AVR ATMega 16 lub mniejszy (po przeróbce w kodzie). PYT1: Obrotomierz kręci...
Witam. Po przerwie wracam do tematu gdyż nadal nie mogę poradzić sobie z obsługą karty Compact Flash za pomocą mikrokonrolera. Sprawa wygląda w ten sposób że wykonałem układ do obsługi karty CF jak na poniższym schemacie. Poniższy schemat jest zaczerpnięty z Elektroniki Praktycznej z rocznika 2/2004 http://obrazki.elektroda.net/39_12252239...
Witam, Po przesiadce z Atmegi8 na wersję 32 postanowiłem ponownie złożyć układ z wyświetlaczem i dwoma termometrami, niestety pomimo użycia tego samego kodu już na początku mam problemy. Po sukcesywnym załadowaniu programu Atmega startuje i prawdopodobnie wywraca się na funkcji lcd_init i nie chce ruszyć dalej. Wspomagalem sie dioda sygnalizacyjna i...
Przy załączeniu napięcia atmedze na wyświetlaczu zamiast oczekiwanego napisu pojawiają się randomowe śmieci. Przy zwyczajnym resecie wszystko jest ok. Z resztą najlepie to widać na filmiku: //MAIN--MAIN--MAIN--MAIN--MAIN--MAIN--MA... portSHORT main(void) { //Inicjalizacja...
Witam, swojego czasu zrobiłem sobie wyświetlacz widmowy, jednak po zabawach w bascomie stwierdziłem że ma to większy potencjał i postanowiłem z niego zrobić zegarek :) Tu zaczęły się schody w ramach testu stworzyłem tablice dla znaków od 0 do 9 plus ":" jako oddzielenie godzin od minut. Jednak program nie wyświetla poprawnie cyfr od 0 do 4 reszta wyświetla...
Witam ponownie, problem powrócił i postanowiłem spróbować napisać taki kod. Czy mógłby mi ktoś powiedzieć na podstawie tego co stworzyłem do tej pory czy idea tego jest dobra. Podstawą na której się opieram jest wypowiedź Pana tmf: "Możliwe. Dlatego trzeba to max uprościć. Z priorytetów bym zrezygnował bo przy szybkości SPI raczej są niepotrzebne. Transakcja...
U mnie w kodzie nie ma ...... /* * sterownik dla Margas * wersja dla NUCLEO STM32F446RE * działa dzieki życzliwości i zaangarzowaniu członków forum ELEKTRODA * wspomagających moją skromną wiedzą programistyczną * za co jestem im bardzo a to bardzo wdzęczny * data xx-xx-2024 */ #include "STM32TimerInterrupt.h" #include "STM32_ISR_Timer.h"...
Więt tak: deklaracja zmiennej : [syntax=c] volatile uint16_t zmienna = 0; // - zmieniam tą wartość później na 300 [/syntax] włączam przerwania według konfiguracji zegara (8MHz - wewnętrzny) [syntax=c] //- uruchomienie eepromu extern EEMEM uint16_t eeprom_values[200]; EEMEM uint16_t eeprom_values[200] = {0,0}; //- konfiguracja zegara void Init_Timer0_OVF(){...
A co robię niezgodnie z dokumentacją? Poniższe funkcje znalazłem na stronie internetowej, która wyglądała całkiem poważnie. Obojętne mi z której flagi będę korzystał byle działało :P A skoro w większości przykładów natknąłem się właśnie na wykorzystanie tych flag to tego się na razie trzymam. ----------------------------------------... W sumie to...
Witam wszystkich, nurtuje mnie dziwnie napisana funkcja delay w bibliotece którą znalazłem do obsługi czujnika wilgotności i temperatury SHT10. Bibliotekę zaimplementowałem w swój projekt, i czujnik ładnie działa, ale za cholerę nie wiem jak on działa korzystając z tego dziwnego delaya...Dlaczego autor nie mógł po prostu użyć wbudowaną funkcję z biblioteki...
volatile atmega atmega volatile atmega volatile zmienna
przewód licznika rozdzielnicy otwiera klapa stycznik załącz wyłącz
adapter bluetooth mackie thump
Xerox WorkCentre 6605 skanowanie do OneDrive – czy działa bez włączonego komputera? STIHL HSE 71 – nie pracuje element tnący, diagnoza i naprawa nożyc elektrycznych