Umieść cały kod. Fragment, który przysłałeś na PW [syntax=c] void loop() { digitalWrite( napiecie, HIGH); // wyjscie na pinie 5v dla testu digitalWrite( niskie, LOW); // wyjscie na pinie 0v dla testu static volatile int stan; if (stan != digitalRead(przeslona)) // jesli pin ma 5v stan = digitalRead(przeslona); { stepper.moveDegreesCW (180); delay(1000);...
Wystarczy policzyć. 19200 bps = 1920 znaków na sekundę, czyli znak co ~0,5 ms. Przy taktowaniu 4MHz masz +/- 2080 cykli procesora pomiędzy przerwaniami od UARTa, czyli duuużo czasu na wykonywanie instrukcji w pętli głównej. Na Twoim miejscu skupiłbym się na przetwarzaniu tekstu np. linia po linii - przerwanie wypełnia bufor, a po wykryciu sekwencji...
Po co Ci zerowanie semafora ? Semafor binarny liczy do 1, więc nie musisz w nim niczego zerować. Generalnie najprostszy semafor działa mniej więcej tak: [syntax=c] static volatile int semCount; Take(){ while(count > 5); count++; } Give(){ count--; }[/syntax] Jest to bardzo prymitywna konstrukcja, ale tak to mniej więcej działa. Binarny poprostu liczy...
Nie znam Atmel Studio, ale jako że korzysta ono z klasycznego make-a... Wygląda, że "grzebnąłeś" sobie gdzieś w opcjach projektu, ewentualnie w automatycznie wygenerowanym pliku Makefile. Najlepiej wklej ten plik tutaj. No chyba, że włączona jest opcja "treat warnings as errors" (czego nie widzę). Aby zlikwidować to ostrzeżenie po prostu dodaj brakujący...
A sznowny kolega "czuje różnicę" pomiędzy: local , global, static , const ,volatile itd. :?: void Timer0(void) interrupt 1 { unsigned int licznik; licznik++; if (licznik == 300) // gdy zmienna licznik jest równy 4000 /*......................................... Piotrek
Pas. static volatile uint32_t get_counter;
Wydaje mi się że to zależy od kompilatora. Taka deklaracja nie zeruje zmiennej, czy kompilator ją niejawnie wyzeruje to zależy od niego. Nawet jeżeli ja zeruje to lepiej zawsze napisać; volatile uint8_t accel_decel_counter = 0; Wtedy program jest jaśniejszy, a dobry kompilator i tak to przypisanie zrobi tylko raz. Standard języka C tego nie definiuje...
Eee, prościzna - zapomniałeś dać volatile w deklaracji. ;) całkiem poprawnie byłoby: static volatile uint8_t Znak;
Napewno [syntax=c]static volatile uint8_t cnt;[/syntax] Jeśli ta zmienna ma być modyfikowana w przerwaniu.
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...
chodziło mi o xdata static volatile .... jak nie zerowałem w pętli, albo inaczej ustawiałem to zawsze pozostawały śmieci albo wartości z przed resetu.Może coś źle robiłem.
zadeklaruj jako static w przerwaniu - jako volatile Zmienne używane globalnie + w przerwaniach powinny być volatile. Wtedy kompilator ci ich nie "zniszczy". Doskonały opis volatile w http://mirekk36.blogspot.com/2011/08/tes...
Wydaje mi się że nie. Ale wstawiłem dla pewności : [syntax=c] ISR( TIMER0_COMP_vect ) { static volatile uint8_t cnt; if(cnt>=pwm1) PORTB &= ~(1<<PB3); else PORTB |= (1<<PB3); cnt++; } [/syntax] I nie pomogło.
Nie dodawałem struktury oraz tablicy do której jest odwołanie w pętli, bo jest spora i nie jej problem dotyczy. [syntax=c]#include "stm32f4xx.h" static volatile uint16_t wyniki[3]; static void MX_DMA_Init(void); static void MX_ADC1_Init(void); while (1) { DP[0].wartosc = 5.f*(wyniki[0])/4096; } static void MX_ADC1_Init(void) { RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;...
"const/static/volatile to magiczne zaklęcia dla mikrokontrolera, który wie, że oto czyta specjalne i bardzo bardzo ważne tajemnicze instrukcje, które musi wykonać dokładnie tak jak napisano i bez żadnych nadinterpretacji". Klaatu... verata... n... Necktie. Nectar. Nickel. Noodle. Nie rozumiem. To Twoje wytłumaczenie tych pojęć? Czy może imputujesz...
240 Hz na dwie cyfry na wyświetlaczu powinno być ok. ;) [syntax=c] // zmienne statyczne static volatile _Bool new_key = 0; static volatile uint8_t key; // kod do wstawienia w procedure obslugi przerwania { static uint8_t tdiv; static _Bool was_released = 0; static const keys[] = {tu wpisy kolejno kodz klawiszy}; // powinno byc PROGMEM if ((++ tdiv &...
Potrzebuję zmiennej lokalnej ale nie ulotnej. Mam kilkanaście procedur które filtrują sygnały i potrzeba mi kilkadziesiąt buforów próbek które oczywiście muszą być niezmienne aby kolejne wywołania funkcji filtrujących poprawnie aktualizowało mi wyjście filtrów. Na razie mam wszystkie zmienne jako globalne volatile ale robi się niezły bałagan. Każdy...
Kod poprawiony w oparciu o to co napisałeś: "Można to zrobić na 2 sposoby: albo modyfikujesz indeks widziany przez przerwanie po odczycie/zapisie (z grubsza tak miał działać kod autora wątku, ale nie do końca tak działał), albo blokujesz przerwania na czas operacji na buforze/indeksie (mało eleganckie)." [syntax=c] // UART1 output buffer #define TXBUF_SIZE32...
OK, ale sam program po wyrzuceniu wszystkich dodatków to nadal prawie 500 linii. Więc zamieściłem tylko część inicjującą. Czy coś przeoczyłem? static volatile unsigned char key1=0, key2=0, key3=0, key4=0; static volatile unsigned char odczyt_keys=0; static volatile unsigned char odczyt_time=0; SIGNAL(SIG_INTERRUPT6) { if(!(PINB&0x01))...
static volatile DWORD Timer1, Timer2; z kolei DWORD to: typedef unsigned longDWORD; probowalem tez wpisywac dokladnie takie same wartosci ja Ty w Twojej funkcji i nic nie pomogło pozatym do obslugi przerwania ustawilem migajaca diodke, jesli sie nie myle od razu po wywolaniu funkcji: SysTick_Conf(); powinno to przerwanie sie generowac co 10ms a wogole...
[syntax=c]static volatile RX_Protocol protocol; volatile RX_Protocol * Get_Handler(void) { return &protocol; }[/syntax] Ten kawałek kodu nie uważam za coś niezwykłego, po prostu tworzy zmienną globalną, z ograniczeniem jej widoczności a poprzez getter przekazuję wskaźnik na nią aby mieć dostęp do jej pól, jest to zwyczajna ukryta struktura, która jest...
[syntax=c] #define BUTTONS_MASK (M1|M2|M3|M4) static volatile uint8_t pressed[4]; ISR(TIMER0_COMP_vect) { static uint8_t licznik; static uint8_t previous[4]; uint8_t current; if (licznik==0) { // wysyłka SPI MULTIPLEX1_ON; } else if(licznik == 1) { ... } //else ... itd asm volatile("nop"); current = PINA; //sprawdzamy stan portu przycisków pressed[licznik]...
https://github.com/diymat/ARM-blog-libra... co prawda do ARM ale przerobić sobie do użycia na AVR to nie problem. Biblioteka z callbackami i 5 stanami key-up key-down, click, długi click i double click. [syntax=c] static volatile BUTTON_Status_T Buttons[NKEYS]; [/syntax] Volatile dla całej tablicy struktur. To już świadczy o kiepskiej...
ciastek4 : Ale po co ukrywanie zmiennej globalnej, skoro ona właśnie ma być widoczna w innym module. Wiem. Może nie jasno się wyraziłem. Moje stwierdzenie wczesniejsze jest odpowiedzia na pytanie w 1 poście: Czy jest jakis sposob zeby kompilator to normalnie skompilowal zeby nie pisac tego w asemblerze ? Odpowiedź : usuń static w deklaracji zmiennej....
Witam Otóż mam taki dylemat ... Mam taki prosty programik robiący mi za licznik modulo 8. Samo liczenie odbywa się w przerwaniu timer'a ale to nie jest kwestia którą chce poruszyć. Po wywołaniu zewnętrznego przerwania, nie da się go przez czas paru/parunastu sekund wywołać. Czego to może być wina ? (pomijając że moja). Czy przypadkiem nie powinno to...
Pod względem oszczędzania mocy powinieneś oszczędzać instrukcje. 1. Niepotrzebna zmienna sleep i jej obsługa. 2. Wielokrotnie wpisujesz wartości rejestrów w pętli (przykładowo ADMUX). Wystarczyłoby chyba zrobić to przed pętlą 3. int x = ADCret(); tego też raczej kompilator nie ma szans zoptymalizować. Lepiej użyć zmiennej globalnej. 4. static volatile...
To co niżej zasugeruje nie musi Ci pomóc ale spróbuj wykonać. Zmienną globalną zadeklaruj jako: static volatile DATACNT W ten sposób powiesz kompilatorowi aby ochronił jej stan przed przypadkową modyfikacją. Z problemem nie panowania nad wartością zmiennej globalnej sam biłem sie tracąc czas i nerwy. Jak się okazało przerwania powodowały nadpisywanie...
Witam, Mam problem z transmisją szeregową na ATMEGA8L. Próbowałem wszystkich znalezionych na forum możliwości ale nic nie pomogło. Może zacznę od połączeń: atmega8l <-> MAX3232 <-> PC MAX-sior (właściwie zamiennik SP3232ECP) podłączony jest według zaleceń datasheet'a. Miedzy MAX-em a PC-tem jest zwykły kabel rs232 (w sensie, że nie przejściówka...
Witam mam problem z "pożenieniem" tego wszystkiego funkcja odbierająca stream [syntax=c]void HAL_UART_RxCpltCallback(UART_HandleTypeD... * uart) { if (esp_recv_char == esp_pattern[esp_char_counter]) { esp_char_counter++; if (esp_char_counter == 5) { esp_recv_mux = uart_read_char(uart); uart_read_char(uart); char length_str[5]; char current_char = 0;...
Cześć, potrzebuję zmierzyć częstość rzędu kilkudziesięciu kHz a nie mam oscyloskopu. Zrobiłem coś takiego: AT90S2313 + LCD na PORTB; na INT0 mierzony sygnał a na INT1 50 Hz z sieci przez transoptor i 7414. Powinno działać, ale na LCD widać na zmianę 0 i 1. :( Przebiegi na INT obecne. Nie mam pojęcia, dlaczego nie działa, może ktoś z Was wskaże jakieś...
Sorry. testy nie byly po kolei. Teraz juz sa: [syntax=c] volatile int xx = 1; volatile int k; static inline void bitband_str_prepare(void) { asm volatile(" \n" "movw r7, #0x84A8 \n" "movt r7, #0x4225 \n" ); } static inline void bitband_str(void) { asm volatile(" \n" "str r6, [r7] \n" ); } static inline void ram_str_prepare(void) { asm volatile(" \n"...
janbernat ---> eeej no co ty opowiadasz że traktuję cię jak początkującego czy jeszcze gorzej jak piszesz - bzdura! Po prostu wiem też że zaczynasz chyba pisać w C i stąd może jakieś dziwne czy nieoczekiwane dla ciebie rzeczy się dzieją. Np dodawanie przydomka volatile do zmiennej static test w przerwaniu nie ma najmniejszego sensu, skoro jest ona wykorzytywana...
Tak krótki komunikat można obsługiwać w przerwaniu od odbiornika UART. Przykładowo, kiedyś robiłem tak: [syntax=c]// Przerwanie odbiornika ISR( USART_RX_vect ) { static volatile uint8_t i=0; uint8_t znak; znak = UDR; // pobranie znaku z bufora sprzętowego switch(stank) { // Jeśli pojawi się znak $ pobierz komunikat case 1: if(znak=='$') stank=2; else...
Zrób to sobie programowo np. weź timer0 i ustaw podstawę czasu tak aby co określony czas timer zgłaszał przerwanie czy to przepełnienia czy porównania w tym przerwaniu umieść np. taki kod [syntax=c] //gl_OCR1 to zmienna globalna pełni funkcje identyczną jak OCR1 uint16_t volatile gl_OCR1 ; ISR(wektor) { static uint16_t zm; if(zm<gl_OCR0) PORTA&=~(1<<PA0);...
#include <inttypes.h> #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #include "lcd.c" #define LED_ON (PORTB|=(1<<4)) #define LED_OFF (PORTB&=~(1<<4)... #define LCD_LIGHT_ON PORTB|=_BV(6) #define LCD_LIGHT_OFF PORTB&=~_BV(6) #define...
Hej. Pacjent to STM32F401VCT6 taktowany domyślnym zegarem wewnętrznym 16MHz. Uruchomiłem sensor HC-SR04 wykorzystując TIM2 do zliczania długości impulsu ECHO wykorzystując tryb capture oraz DMA. Do rejestru TIM2->PSC ładuje 15, ponieważ chcę aby wartość CNT inkrementowała się co 1us. Kod źródłowy poniżej: [syntax=c] #include "stm32f4xx.h" static...
Cześć, Mam taki fragment kodu: [syntax=c] static const volatile uint32_t systick = 0; uint32_t GetTimeUs(void) { return systick; } void HAL_SYSTICK_Callback() { systick++; }[/syntax] który się nie kompiluje, dostaję taki błąd kompilacji. [syntax=c]../Application/Time.c:31:19: error: increment of read-only variable 'systick'[/syntax] Z tego co wiem powinno...
#include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> char s[] ="0101011010101010101010101010"... static volatile unsigned int a; SIGNAL (SIG_OVERFLOW1){ TCNT1H = 0xd9; TCNT1L = 0x99; PORTB=s[a++]&0x01; if(a==27)a=0; } int main(void) { DDRB=0xff; TCNT1H...
Stad też często dla celu debug stosuje się optymalizację na poziomie 1 (O1) lub nawet 0 (O0). Ja wolę zadeklarować jako static a czasem aby śledzić stan w pracy krokowej trzeba jeszcze dodać volatile. Czyli na okrętkę robisz to co robi -O0. static wprowadza tyle różnic w stosunku do normalnej deklaracji zmiennej, że powstaje pytanie o sens takiego...
Dodałem zapamiętywanie obsługi sygnałów przed wywołaniem Sequencera, i przywracanie oryginalnego stanu po jego zakończeniu - ale nadal jest SIGSEGV. [syntax=c]#include "epicsThread.h" #include "iocsh.h" #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 500 #endif #include "extcode.h" #include <signal.h> #include <stdio.h> #include <unistd.h>...
Czy program napisany na np atmege328 w atmel studio czy innych edytorach będzie mógł zostać od razu wgrany na np atmege1284 czy trzeba będzie tam dużo pozmieniać.(to ma dla mnie bardzo duże znaczenie) Edytor nie ma nic do rzeczy. Zależy jak sam napiszesz program. Jeśli napiszesz wszystko w jednym pliku, to przenoszenie bardzo trudne i będzie "polowaniem"...
Hej Niedawno zaczalem programowac PICe i mam pewien problem, kompilator HITECH. Problem jest taki ze na terminal uC wyrzuca jakies niechciane znaki. kawalek kodu: volatile static BYTE str[] = "\nSTART\n"; volatile static BYTE modem[] = "Modem up\n"; volatile static BYTE ef = 'f'; volatile bank1 BYTE TX_pressure[8];...
Bardzo wiele zostało już powiedziane (bardzo dobre porady). Moim zdaniem krokiem zero jest jako tako umieć programować w C na PC (jak przebiega proces kompilacji, kod źródłowy podzielony na pliki *.c i *.h, organizacja pamięci i wskaźniki, struktury i wskaźniki do nich, słowa kluczowe register, volatile, static, etc., preprocesor, makefiles i make,...
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...
Dzięki za odpowiedź. mo make clean mam: "Removing all generated output files from output directory: out/ cs-rm -f out/stm32f10x_it.d out/stm32f10x_it.lst out/stm32f10x_it.o make: cs-rm: Polecenie nie znalezione Makefile:290: polecenia dla obiektu 'clean' nie powiodły się make: *** Compiling file: main.c arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb...
W AVR306 mozna znalezc taki kod obslugi USARTA dla atmegi128: #include <avr/io.h> #include <avr/iom128.h> #include <avr/ina90.h> /* UART Buffer Defines */ #define USART_RX_BUFFER_SIZE 128 /* 2,4,8,16,32,64,128 or 256 bytes */ #define USART_TX_BUFFER_SIZE 128 /* 2,4,8,16,32,64,128 or 256 bytes */ #define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE...
Mam problem, bo za bardzo nie wiem jak jednocześnie liczyć impulsy na kilku wejściach. #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/rs232.h> static volatile unsigned int l; SIGNAL (SIG_OVERFLOW1){ TCNT1H = 0x81; TCNT1L = 0x71; USART_Transmit(l/2); l=0; } int main(void)...
Nie można. Co da ci to, że Timer1/2 zrobisz static? To musi być volatile. Natomiast istotnie, trudno pomóc, jeśli nie wiadomo w czym jest problem :)
Witam, mam problem z realizacją układu z tej strony: [url=http://wiki.electronics-irc.net/Avr... Chciałem, aby atmega po odbiorze kodu z pilota wysterowywała odpowiednio przypisane piny portu D. Tu jest kod po zmianach: [syntax=cpp]#include <avr/interrupt.h> #include <avr/io.h> #include <util/delay.h> // #define...
Error message from debugger back end: value has been optimized out To chyba wszystko tłumaczy. Zmniejsz poziom optymizacji albo zrób je tymczasowo static lub volatile. Ja czasami w czasie debugowania, jak nie jest to problem, robie z volatile aby przy kazdej operacji zapisywane były w pamieci. Proponuje zapoznać się z poradnikiem kolegi szczywronka...
Mam 2 moduły w postaci takich plików (przykładowy kod): modul1.h: x i wywołuję funkcję funkcja1() , ale ta funkcja nie widzi zmienionej wartości zmiennej x . Czy ktoś mógłby mi podpowiedzieć co tu jest nie tak i ewentualnie jak to "naprawić"? Niestety C/C++ znam dość słabo i pewnie nie pamiętam o jakiejś ważnej rzeczy, która powoduje takie zachowanie.
Próbowałem deklarować zmienną nr_trybu w różny sposób (volatile, extern, volatile, static). Nie pomaga. Coś gdzieś zachodzi na siebie. Zauważyłem, że jaką przypiszę tej zmiennej wartość w przerwaniu, taką ona potem przyjmuje w chwili jeżeli nie spełni się opisywany warunek.
Dobry wieczór, krótko : - program z wykorzystaniem ATmega16L + hc-sr04(ultradźwiękowy czujnik odległości) - mam problem z wyświetlaniem znaków bo powinno pisać : CIRCUIT DIGEST/DISTANCE=[i tu odleglosc w cm] - jest napisane CKSCWKT DKGGST/DKSTCOCG?33CM - na schemacie jest ATmega32 ja mam ATmega16 - http://circuitdigest.com/fullimage?i=cir...
Wstawiam poniżej kod programu. Gdy w programie obsługuje tylko adc problem wyglada inaczej. Gdy wzrasta napiecie na jakimkolwiek pinie to następuje interakcja z dwoma pozostałymi analogami. [syntax=c]volatile uint16_t a; volatile uint16_t b; volatile uint16_t c; static volatile uint16_t wyniki[3]; int main(){ fpu_enable(); system_init(); pll_start(CRYSTAL,...
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...
Może coś takiego: [syntax=C]//****************************... // +--+ // | ++----+ // +-++ | // | | // +-+--+ | // | +--+--+ // +----+ Copyright (c) 2009 Code Red Technologies Ltd. // // Microcontroller Startup code for use with Red Suite // // Software License Agreement // // The software is owned by Code...
Fajne nie? Prawdziwa jazda zaczyna się jednak dopiero wtedy, gdy takie wskaźniki mają być jeszcze statyczne uint32_t * volatile static ptr; -> ../main.cpp:49: error: expected unqualified-id before 'static' ../main.cpp:49: error: expected initializer before 'static' Ktoś mi to wytłumaczy skoro już przy tym jesteśmy? Czemu "const"...
Witam ponownie, Poszedłem o krok dalej i moim planem jest podłączenie każdego z czterech wtryskiwaczy do osobnego pinu Arduino Uno/Nano z Atmega 328p. Pozwoliło mi to na skonstruowanie programu aby sterować każdym wtryskiwaczem z osobna z tą samą częstotliwością i wypełnieniem, ale sygnał do ich wysterowania jest przesunięty około 90° (problem z rozdzielczością...
Witam, Chcę połączyć ze sobą dwie atmegi po TWI korzystam ze standardowej biblioteki do obsługi sprzętowego TWi tak jak w datasheetach. Jak podłączę jednego AVR do np Ds1307 to obsługa jest ok w dwie strony. Problem mam gdy połączę Atmega32 (master) z Atmega8 (slave) tzn gdy z Atmegi32 wysyłam coś np literkę 'q' to jest ona wrzucana do buf2 i ma się...
Czasem Arduino do czegoś się przyda Dodano po 2 Możesz dać przykład takiej krytycznej czasowo operacji? Problem jest a raczej był związany z buforem nadawczym uarta. Mam funkcję: Blokuj tylko przerwania od UART.
Dokładnie kolega R-MIK dopero zaczynam ale staram się sukcesywnie uczyć ;) Nie wiem jak ty ale ja jestem niecierpliwy i nie czekałbym az ktoś mi odpowie, zwłaszcza, ze pytasz o podstawy, o których można przeczytać w sektach miejsc. Odpal sobie debuger, nawet programowy i zobacz jak będzie zmieniał się bit w bajcie/słowie po wykonaniu różnych operacji....
Sory, ale na tym poziomie dyskusja nie ma sensu. Jak będziesz miał coś konkretnego do napisania to możemy kontynuować. OK konkretnie to draft ISO/IEC DTR 18037 wprowadza pewną wiedzę na ten temat do kompilatorów obsługujących tego typu rozszerzenia. Z tym się chyba zgodzisz. Zresztą to mi nie wygląda na "wsparcie w binutils" : http://avr-gcc.senthilthecoder.com/#g:!(...
Witam, Piszę projekt na w/w ARMie Atmela i mam problem z uruchomieniem przerwań. Wydaje mi się, że funkcję do ich obsługi mam poprawnie napisaną, jednak mimo to nie działa, stąd podejrzenie, że wszystko zależy od pliku startowego. Z resztą oceńcie sami. Obsługa USARTu wygląda następująco: [syntax=c]#include "Board.h" #define USART_BASE AT91C_BASE_US0...
Witam, próbuję zaprogramować mikrokontroler,aby obsługiwał USART do komunikacji przez RS232. Chcę wykorzystać do tego bufor cykliczny, który zaimplementowałem w następujący sposób: [syntax=c] #include <inttypes.h> #define BUFFER_SIZE 32 #define BUFFER_MASK ( BUFFER_SIZE - 1) typedef struct { uint8_t buffer[BUFFER_SIZE]; uint8_t head; uint8_t tail;...
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...
Niestety pokazałeś zły kod - jak wpłynie na poprawność działania pokazanego przez Ciebie kodu: [syntax=c]RxCount=0x00;[/syntax] umieszczone w pętli głównej? Prawidłowo powinno być na przykład tak: [syntax=c]#include <avr/io.h> ... volatile uint8_t flaga; // liczba odczytanych bajtow volatile uint8_t temp[2]; // odczytana temp ISR(USART_RXC_vect)...
Witajcie, w jaki sposób można optymalnie odczytać przesłany (aż do znaku nowej linii / powrotu karetki) ciąg znaków od przerwania otrzymania danych? /* * Sterowanie przez RS232 (main.c) */ #include "defines.h" #include <ctype.h> #include <stdint.h> #include <stdlib.h> #include <stdio.h> #include <avr/interrupt.h>...
Witam; Dorywczo, czasem coś próbuję skrobnąć, a tym razem: 1. Jest jakiś sposób na inicjalizację dużych ( np. Tab https://obrazki.elektroda.pl/4802236500_... ps. przy włączonym bicie NVM_EEMAPEN stan bufora to oczywiście same 0xff .
funkcja main zawiera tylko nieskończoną pętlę z definicją zmiennej, aby sprawdzić, czy debugger zatrzyma się na zaznaczonym breakpoincie, niestety tak się nie dzieje. Zdefiniuj zmienną static albo globalną, z atrybutem volatile lub wyłącz optymalizację.
sa sobie moje wlasne funkcje do zapisu do EEPROMu: uint8_t *_save_src_adr=0; uint8_t *_save_dst_adr=0; volatile uint8_t _save_length=0; ... void _eeprom_save_block(uint8_t *src,uint8_t *dst,uint8_t length) { while(_save_length); _save_src_adr=src; _save_dst_adr=dst; _save_length=length; EECR|=EECR_EERIE; } ... ISR(EE_RDY_vect)...
Dzięki za biblio ;) Ja korzystam od dawna z bibliotek od Mirka z BlueBooka lekko przeze mnie zmodyfikowanych. Odświeżam temat bo jednak mam problem: http://obrazki.elektroda.pl/2645882300_1... http://obrazki.elektroda.pl/2587616400_1... http://obrazki.elektroda.pl/8131694900_1... http://obrazki.elektroda.pl/2415856600_1...
(at)arturt134 Robiłem to co mi sugerujesz - bezowocnie. Ale spostrzegłem ciekawą rzecz: wysyłając pakiet czynię to co parę sekund (ręcznie), przypadkowo dałem chwilkę czasu (5..10 min.) spokoju ATMEDZE (musiałem coś tam innego zrobić), po tym czasie znowu wysłalem pakiet i o dziwo ramka wyglądała jak po resecie uC! Ale następne znowu były oszukane....
(at)ElektrodaBot Ta wersja wygląda najlepiej. Zweryfikuj jej użycie pod kątem pracy w środowisku ESP-IDF/FreeRTOS, w tym ISR. Bezpośrednia odpowiedź Funkcja `atomic_swap_relaxed()` (zamiana za pomocą `exchange + store`) jest: • poprawna i wystarczająco szybka w zwykłych wątkach FreeRTOS na ESP32 (dla typów ≤ 32 bit), • niewskazana do uruchamiania bezpośrednio...
Problem już prawie rozwiązany, gdyż moja lista z projektami świeciła się jak choinka za sprawą tych samych, złych bibliotek. Poprawiłem już prawie wszystko, ale chce się upewnić co do jednego. Czy w kodzie który zamieszczam wystarczy usunąć "||" czy coś tam powinno być? W pliku źródłowym na jakiejś stronie internetowej też tego nie ma, więc nie usunąłem...
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...
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__"...
Taki zapis ( definicja )powinien być w jednym pliku C (zmienna globalna) volatile unsigned char stan = CZEKAJ; w pliku headera (chyba sensor.h) tylko deklaracja extern volatile unsigned char stan; w żadnym wypadku nie można dawać w headerze (pliku *.h) includowanym do wielu plików *.c definicji zmiennej statycznej static unsigned char stan = CZEKAJ;...
Z drugiej strony nie wiem, czy zamiast rozdawać czwartoklasistom badziewiaste laptopy, takie Pi500 by nie miało więcej sensu Napewno miało by więcej sensu, czegoś innego niż x86, zapoznania z Linuxem. Wszyscy nie będą programistami, połowa dzieciaków przehandluje toto na allegro. A farbkek na plastykę, instrumentów w klasach brak, byle szafek na książki...
Witam. Po dość długim czasie postanowiłem powrócić do programowania AVR ze względu na mały projekt który planuję w niedalekiej przyszłości. Zaopatrzyłem się w oprogramowanie, mikrokontroler i do dzieła. Po całym dniu oprogramowywania różnych peryferiów utknąłem na ADC. Otóż mam taki problem, że nie działa mi procedura obsługi przerwania od ADC umieszczona...
Wrzucam moją wersję programu do obsługi 4 serw. W ostatnim tygodniu zakupiłem swoje pierwsze dwa serwa, więc mogłem się pobawić problemem ich sterowania. Z powodu, że mam tylko dwa, jedynie dwa kanały są sterowane z przetworników ADC. Pozostałe są obsługiwane przez przerwania, ale nie ustawiane. Wartości dla serw wpisuje się w tablicy serwa_val[]. Doświadczalnie...
ustaw sobie przerwanie od np. TIMER2 co 10ms i sprawdzaj 4 ostatnie stany przycisku. teoria: http://mikrokontrolery.blogspot.com/2011... powyższe zaadoptowane do A8: [syntax=c] //**************definicja przycisku************** #define _Key _BV(PD7) #define Key_PIN PIND #define Key_DDR DDRD #define Key_PORTPORTD...
Witam. Sprzęt: -Atmega644P + kwarc 16mgh, -Serwo TowerPro GS-5010, (na pinie PD5/OC1A) -potencjometr A10k. (na pinie PA0/ADC0) -środowisko Eclipse Luna, Problem: Za pomocą załączonego kodu, gdy steruje potencjometrem, ciężko ustawić je w zadanej pozycji. Albo szarpie i nie może się ustawić albo od razu przesuwa się do końca i szarpie. Pewnie coś źle...
Nie możesz odczytywać kilka razy pod rząd ADC, bo w trybie konwersji ciągłej może się zdarzyć, że wartość zmieni się w trakcie Twojej zamiany. Jeśli np. zmieni się z 99 na 100, to wyświetlisz 199. % 1000 % 100 to też to samo, co %100. Nie ma też sensu zmieniać wartości wyświetlanej aż tak często - do odczytu przez człowieka max. kilka razy na sekundę....
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...
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:...
Witam. Po raz kolejny wracam do tematu przerwań: [syntax=c] #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> volatile static uint16_t i; volatile static uint8_t k; // główna funkcja programu main() int main(void) { //**************************** SPRZĘTOWY PWM - 1 KANAŁ OC0 (PB3) ****************************************...
Ok, to postaram się krótko i na temat ;-) Moduł RFM12B podłączony jest do ATMega8 następująco: MEGA8 - RFM12B (16) SS - NSEL (17) MOSI - SDI (18) MISO - SDO (19) SCK - SCK (5) INT1 - DCLK/CFIL/FFIT oraz FSK/DATA/nFFS przez rezystor 10k do Vcc Makro, którego używam dla klarowności kodu: #define cbi(sfr, bit)...
Przy tej samej prędkosci zegara PIC-e maję wolniejszy FLASH - przy 48MHZ PIC-e 2WS a F0 1WS. Tak że będą czytać stałe z FLASH wolniej. oba procki chodzą na 24MHz, ze względu na pobór prądu Na prośbę moderatora: PIC32MX150, STM32F030K6T6 Tu prosta maszyna stanów - funkcja, która wykonuje się wolniej o jakieś 30...40% niż na PIC. Uprzedzam, sprawdziłem,...
KEY=((PIND & 0x01) & 1); 1. Nazw zmiennych zwyczajowo nie pisze się wielkimi literami 2. Wystarczy: key = PIND >> NR LINII PRZYCISKU & 1; - w ten sam sposób dla każdego przycisku. 3. Nie ma sensu deklarować zmiennych związanych ze stanem przycisków poza procedurą przerwania timera, bo nie są one nigdzie więcej potrzebne. Zmienne keystate powinny mieć...
Witam. Oto mój kod: while (!(ADC1->SR & ADC_SR_EOC)); Zgodnie z moimi wyszukiwaniami na temat bitu ADC_SR_EOC : This bit is set by hardware at the end of the conversion of a regular group of channels. It is cleared by software or by reading the ADC_DR register. Czyli DMA w momencie odczytania wartości z rejestru DR także kasuje...
W skrócie mój kod wygłąda tak: #include'y typedef unsigned int UINT; typedef enum {FALSE = 0, TRUE = 1} BOOL; static volatile BOOL var1, var2; int main(void) { var1 = FALSE; var2 = FALSE; LCD_Open(); PIT_Open(250, sys_irq_handler); while (1) { if (var1 == TRUE) { LCD_DrawCharC(2, 42,...
Witam, Ostatnio zacząłem przechodzić na mikrokontrolery STM32 i testowałem program zawarty poniżej. Licznik TIM2 zlicza w górę, drugi licznik generuje żądanie DMA od przepełnienia się licznika, wysyłając wartość licznika CNT TIM2 do tablicy, która jest inkrementowana. Powinienem otrzymać w tablicy wartości zwiększające się cyklicznie co tą samą wartość,...
Cześć, Napisałem program, który miał odtwarzać utwór z karty SD o nazwie o.wav . Program poprawie otwiera plik, jednak ze słuchawka nie wydaje dźwięku... Czy mógłby ktoś sprawdzić mój kod czy nie ma tam żadnego błędu ? Myślałem że same wyprowadzenie odczytanych wartości hex z pliku muzycznego i "wypuszczenie" ich na PWM w zupełności wystarczy, ale widocznie...
Cze, W moim programie chciałbym wrzucić pewną tablice stałych (dość dużą, zajęła by ona połowę RAMu w F100RB) do pamięci Flash. Problem polega na tym, że jakoś nie potrafię skłonić linkera do tego aby to uczynił. Testowo deklarowałem trochę mniejszą tablicę w taki sposób: [syntax=cpp]volatile static const char test[2][2][2][10] = {............}[/syntax]...
Uwaga! 1) Jeżeli zmienną licznik będziesz miał zadeklarowaną wewnątrz funkcji obsługującej przerwanie to przykładowa deklaracja powinna wyglądać tak: static uint8_t licznik = 0; 2) Jeżeli natomiast zmienną licznik zadeklarujesz gdzieś w programie głównym, wtedy powinieneś ją przykładowo zadeklarować jako: volatile uint8_t licznik = 0; po co te "przedrostki"...
Kod który działa: [syntax=c]//----------------------------... static void configure_SDADC1(void) { volatile uint32_t i2; PWR->CR |= PWR_CR_SDADC1EN | PWR_CR_SDADC2EN | PWR_CR_SDADC3EN; RCC->APB2ENR |= RCC_APB2ENR_SDADC1EN | RCC_APB2ENR_SDADC2EN | RCC_APB2ENR_SDADC3EN; for (i2=0; i2<255; i2++); SDADC1->CR2...
Wskazany w linku debugger to zapewne JLink ale za cenę niespełna 10 $ to napewno nielegalny klon :) Jeżeli chcesz poznać LPC'ki i mieć debugger to wejściami . Kiedyś zapomniałem o tym fakcie i dziwiłem się dlaczego program nie działa tak jakbym się tego spodziewał.
W pierwszym przypadku w celu jak największej dokładności czasu opóźnienia jest wyliczana liczba przebiegów wewnętrznej pętli (która wykonuje się w 3 lub 4 cyklach, zależnie od tego, czy licznik może mieć 1 bajt, czy musi mieć 2 bajty) - te obliczenia są wykonywane na liczbach zmiennoprzecinkowych. Co do drugiego kodu, nie jest on funkcjonalnie taki...
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...
Kod funkcji włączania i wyłączania np. diody Ten kod będzie powodował, że po pełnym zapaleniu dioda z powrotem zgaśnie i zacznie się rozjaśniać. Linijka z ifem nic nie robi, bo wartość byte nie może być mniejsza od zera ani większa od 255. Poza tym po wciśnięciu przycisku będzie dodawana nowa funkcja przerwania onLamp() bez usuwania starej i będą ze...
volatile static volatile przerwać static routing
rysunek skrzyni biegów protect radio kenwood głowica decka
raspberry projekty kostka licznika yamaha
Czy zmywarka Bosch SPS66TI01E ma zeolit? Najczęstsze awarie przetwornic samochodowych