A gdzie jest obsługa przerwania?
Zamiast wstawiać argument do delaya umieść delaya w pętli for ze stałym argumentem. Zmienna zawsze znajdują się w SRAM. Ale stałe można umieścić w pamięci programu.
sama pętla for dodaje jeszcze 3 cykle zegarowe, popatrz na liczbę wykonań pętli dla 8MHz zegara pierwsza to 70*3/8000ms + 70*1ms = 26,25µs + 70 ms druga 70000*3/8000ms + 70ms = 26.25ms + 70ms różnica jest ogromna...
Nawet z uwzględnieniem zmniejszenia dokładności (które przy wykorzystaniu aktualnej wersji avr-gcc przy typowych opcjach kompilacji nie występuje – patrz fragment If the avr-gcc toolchain has __builtin_avr_delay_cycles(unsigned long) support w dokumentacji) te funkcje (jako same w sobie) są całkiem niezłe. W praktycznych zastosowaniach ich niedokładność...
Aby sprawdzić czy optymalizacja zmieniła kod uruchom debugowanie w AVR Studio i zobacz podgląd kodu assemblera poprzez menu View/Disassembler.
Zmień delay na 250 ms...
Bo nie używa się wersji beta programów bez powodu. A już w szczególności jeśli jest się początkującym. Jakbyś zainstalował WinAVR to najpewniej ten kod (aczkolwiek nie najlepszej jakości) by zadziałał. Powodem jest skopane delay.
chodzi płynniej bo w jego kodzie nie ma instrukcji delay(400)
Ponieważ wszystkie piny masz na porcie D, to zadeklaruj tablicę z maskami pinów portu D (LEDów) oraz czasami, i wywołuj w jednej krótkiej pętli idąc od początku do końca tablicy.
W tym trybie który wybrałeś (Single Mode) możesz generować PWM na PA0, PA1 i PA2. Zobacz sobe ten kod: [syntax=c]#define PERIOD_EXAMPLE_VALUE (0x01A0) //dec 416 F_PWM = 3.333MHz/4/416/2 = 1KHz (in dual slope PWM) #define DUTY_CYCLE_EXAMPLE_VALUE0 (0x00D0) // dec 208 (208/416 = 50%) #define DUTY_CYCLE_EXAMPLE_VALUE1 (0x003E) // dec 62 (62/416 = 15%)...
Krzemowy napisał: Nie trzeba pisać #define F_CPU xxxxx Nawet należy to pisać bo czasami (nawet często kod nie jest kompilowany tylko i wyłącznie w AVRStudio, czasem jest to WinAVR albo w ogóle na innym systemie operacyjnym) nie zaskakuje #include<util/delay> bez tego i zaczynają się problemy z szukaniem głupiego błędu :) Pozdrawiam maly_elektronik
Nie przesadzaj, czy to jest AS, czy Eclipse, to działa to dokładnie tak samo - kompilator musi mieć przekazaną definicję symbolu F_CPU, czyli w wywołaniu musi się znaleźć -DF_CPU=xxx. Czy masz gotowe okienko, gdzie pisze "Tu ustaw częstotliwość", czy to okienko nazwiemy "Define symbols" to wygląda to tak samo. BTW, zonki w AS5 wynikały z toolchaina,...
Chcę aby na Attiny 2313a i Atmega 8a był program z użyciem millis , nie delay , w j.C ,i aby nie było to w Arduino. Multiwibrator astabilny bez delay a z millis na PB3 i PB4 ,zmiana polaryzacji między tymi pinami co 64 sekund ,lub koło 64 sekund. Taki program jak poniżej w j.C ,(nie Arduino ) , tylko bez delay a z millis [syntax=c]#include <avr/io.h>...
Jeżeli nie ma nic w buforze to jest <=0 i dlatego masz to co jest w else. Jednak zwracam uwagę na mnogość delay, które blokują np. odczyt serial w czasie, gdy są aktywne i wszystkie instrukcje czekają na zakończenie delay. Pozdr Sławek
Wypróbuj ten kod: [syntax=c] #define F_CPU 16000000 #include <stdlib.h> #include <avr/io.h> #include <util/delay.h> //-------LCD------------------------ #define LCD_ADDRESS (0x7C) /* * LCD_commands */ #define LCD_CLEARDISPLAY 0x01 #define LCD_RETURNHOME 0x02 #define LCD_ENTRYMODESET 0x04 #define LCD_DISPLAYCONTROL 0x08 #define LCD_CURSORSHIFT...
Powiedz mi dlaczego - skoro korzystasz z Bytematch to dajesz parametr ALL ??? a przecież piszesz że odbierasz swoją "ramkę danych" zakończoną znakiem chr(13)... I znowu mógłbym się rozpisać za długo jak warto podchodzić do transmisji danych przez RS232, że warto wykorzystać własnie znaki końca linii do wyłapywania zdarzeń, że warto wtedy ustawiać flagę...
I zależy też od tego na jaką optymalizację kodu sobie możesz pozwolić. Optymalizując można zmiejszyć rozmiar "wsadu" 30-60% (zależnie od programu i typu optymalizacji), a to sporo. Trzeba jednak pamiętać, że optymalizują się również pętle, więc o dokładnych delayach zrobionych na pętlach można zapomnieć.
Ja postaram się Ci pomóc... Teraz jestem w pracy, więc nie przeanalizowałem dokładnie - od razu mówię. Spróbuj wyłączyć bibliotekę od delay'ów i napisać kawałek kodu, ale zamiast _delay_ms użyj jakiejś pętli w pętli. Kilka dni kiedyś dochodziłem, co mi nie gra w programie i się okazało, że to właśnie to bruździło (wyszło w końcu na debugerze). To tak...
Żabek to nie wstawiaj komentarzy. Utwórz kopię pliku delay.h a potem napisz na szybkiego swoją wersję z zwartością TYLKO taką i nic więcej: void _delay_ms(double __ms) {} void _delay_us(double __us) {} I po tym -O0 powinno śmigać. Jest to niezbyt ładne, ale skuteczne i trwa moment oraz nie wymaga szerszej wiedzy....
Odrzucanie pierwszego wyniku, czy też serii wyników, to tylko proteza do źle zaprojektowanego algorytmu. Takoż samo algorytm używający jakiegoś opóźnienia (nie piszę o delay). Jak komuś zależy na dokładności, to nie używa wbudowanego, powolnego i mocno ograniczonego ADC A to jest demagogia, w obronie jakiś dziwnych tez. Zresztą opóżnienie Ja piszę...
Nie wspomniałem o delay.
Atmega128 - domyślnie sprzedawany z zaprogramowanym fusebitem ustawiającym tryb kompatybilności z m103 (bit m103c w efuse). To powoduje, że pamięć ram jest od końca ucięta (o 256 bajtów), a więc spód stosu jest uszkodzony. Wywołanie działa ok, ale powrót powoduje błędy (brak poprawnego adresu powrotu na stosie). Musisz zmienić ten bit w fusebitach,...
Nie odpowiada on jednak na pytanie: Full-swing czy Ext. Crystal Osc.? Aliści (jest takie słowo!) podejrzałem składnię polecenia generowanego przy wgrywaniu bootloadera i w nim lfuse=0b11110111 czyli 0xF7 zatem - Ext. Full-swingCrystal. Ustawienia fusebits są w pliku avrdude.conf dostarczanym wraz z MiniCore. Sekcja dla 328 wygląda następująco: [syntax=ini]#---------------------------...
100n przy zasilaniu uC?, pozd Gdzie się dokładnie ustawia to Port Delay?, pozd
Jakie środowisko? ATmelStudio5/6? Jeśli tak to musisz wejść w opcje kompilatora i zdefiniować globalnie stałą F_CPU. Kilka razy już o tym na forum zdaje się pisałem, nawet gdzieś screeny były. Bo takiej definicji plik z delay może nie widzieć...
Musisz całkowicie zmienić obsługe slave. Po pierwsze musisz wprowadzić synchronizację, czyli machać linią SS. Po drugie odbiór w slave należałoby oprzeć na przerwania SPI - SPI nie ma wielostopniowego bufora, kolejne bity nadpisują poprzednie. W efekcie musisz mieć pewność, że zdążysz z odbiorem. To w miarę gwearantują ci przerwania, na pewno nie delaye...
To co zrobiłeś nie miało prawa zadziałać z wybraną płytką NG, ona ma ustwienie na kwarc 16MHz: c:\Program Files (x86)\Arduino\hardware\arduino\avr\board... ... ########################################... atmegang.name=Arduino NG or older atmegang.upload.tool=avrdude atmegang.upload.protocol=arduino atmegang.upload.speed=19200 atmegang.bootloader.tool=avrdude...
Zdziwienie- nie. Ale mateusz powinien się uczyć prawidłowo programować- więc bez goto i delay. No- delay i goto- może potem.
(at)emarcus wszystko jest dobrze połączone, nie mam żadnego zwarcia. Ten błąd na który zwróciłeś uwagę to zwykła pomyłka przy pisaniu. A pisząc ze diody czujnika świecą poprawnie miałem na myśli diodę D0-LED po zanurzeniu w wodzie zaświeca się. Pozdrawiam Dioda ‘D0-LED’ ma nie wiele wspólnego z twoim programem. Jest to dioda podłaczona...
Jeśli program reaguje na zmiany F_CPU, a nie reaguje na zmianę parametru _Delay_ms to jest to mega dziwne. Jesteś pewien, że kompilujesz właściwy plik? Ustawienia fusebitów nie mają znaczenia, bo jeśli program działa, to niezależnie od wybranego zegara zmiana parametru delay musi wpłynąć na okres świecenia diody. Natomiast mnie niepokoi pewna niespójność...
Treść Twojego programu nie odpowiada założonej funkcjonalności. Podobno chcesz, żeby silnik śledził położenie potencjometru, a tymczasem robisz coś zupełnie innego - wykonujesz pewną liczbę kroków w zależności od różnicy dwóch kolejnych pomiarów ADC. Zacznij od przerwania timera, zgłaszanego z okresem kroku. W nim odczytaj ADC i przefiltruj (obecnie...
Po pierwsze to włączenie optymalizacji nie skróci delaya, tylko wyłączenie go wydłuży. Druga sprawa to kolega Sokol_09334 nie bardzo chce chyba czytać ze zrozumieniem. Nie chodzi o to żeby zadeklarować poprawną wartość FOSC, tylko powyżej 262.14 ms / F_CPU delay jest niedokładny, czyli u kolegi już przy 22ms.
Zadeklaruj sobie zmienną "flagę" (volatile) i ustawiaj ją w przerwaniu na 1 w procedurze obsługi przerwania. W pętli głównej sprawdzasz if'em stan tej flagi i wykonujesz jakieś działanie, a następnie ustawiasz "flagę" na 0 i tak w kółko. Jak napisał Mirek, w przerwaniach nie używamy żadnych "delay"(!). Pozdrawiam Piotrek
Masz cos jeszcze podlaczone do tego portu? Wez sprawdz takie program: #include "delay.h" #include <avr/io.h> void main() { DDRB |= _BV(6); PORTB | = _BV(6); while(1) { PORTB |= _BV(6); delayms(100); PORTB &= ~_BV(6); delayms(100); } }
Natomiast drążąc dalej temat jak wyjaśnić to, że na atmedze16 przy identycznej kofiguracji fuse'ów wszystko działało elegancko? Na procku ATmega162 ale podobnie na ATmega88 itp ... też działa elegancko. Tyle, że trzeba doczytać w nocie i pamiętać, że domyślnie Watchdog jest włączony. I wcale nie trzeba go zaraz fusami wyłączać bo po co? Może się często...
Zamiast delay() możesz użyć millis(). Biblioteki dla wielowątkowości też znajdzesz. Dla krokowców możesz użyć biblioteki AccelStepper: http://www.airspayce.com/mikem/arduino/A... Dostępne biblioteki możesz przeglądać w menadżerze: https://www.arduino.cc/en/Guide/Librarie...
Oj, przejrzałem pobieżnie kod - uwierz mi - skasuj go. W C jest coś takiego jak funkcje - wykorzystaj to, kod, który masz jest kompletnie nieczytelny. Każdy normalny promotor by to coś uwalił chociażby za to. Co do szybkości działania - pokaż kod funkcji odpowiedzialnych za komunikację z czujnikami. Z kodu, który masz: - funkcjie piszące do LCD są zapewne...
Dlaczego delay jest poza forem.Podzielnik powinen byc 20 (0-19).
Faktycznie, dużo lepiej opisane. W każdym razie, jak opanujesz pierwszy program ledowy, warto go potem przerobić tak, aby wykorzystać funkcje milis() zamiast delay(). Dzięki temu będzie heartbeat, który wywolywany w pętli programu pozwoli określić czy program pracuje czy wisi.
The maximal possible delay is 262.14 ms / F_CPU in MHz.
(at)dondu Aha. Spróbuje Twoją metodą. Mam jeszcze pytanie: czy jeżeli zastosuje taki zamiennik delay: [syntax=c]int lpDelay(int quarterSeconds) { int oldClkPr = CLKPR; // save old system clock prescale CLKPR = 0x80; // Tell the AtMega we want to change the system clock CLKPR = 0x02; // 1/256 prescaler = 60KHz for a 16MHz crystal delay(quarterSeconds);...
Zmienna count powinna być volatile .
Witam Nie wiem co to za silnik, ale trudno będzie zaobserwować cokolwiek jak traktujesz silnik dość szybkozmiennym przebiegiem piłokształtnym ( wartość test zmienia się 10 razy na sekundę ) jak na typowe bezwładności silników. Nie wnikam czy delay jest cool w programach, ale jak zwiększysz delay do 1000 to może coś zauważysz. Druga sprawa to Fast PWM,...
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...
Tak się objawiają uszkodzone czujniki. Sprawdź go jeszcze raz w bascomie. Pozatym masz jakieś dziwne te delay'e czemu używasz funkcji owire_delay przecież masz _delay_ms? Trochę wróżąc z kodu wnioskuje że funkcja delay odmierza 0,25us * przekazany argument. Piszesz w komenarzach że niby ta pętla for + funkcja poniżej jej trwa 470ms. Jak nie przestawiałeś...
"Build started 8.7.2009 at 23:05:46 avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT AT128_FatFS_SD_S65.o -MF dep/AT128_FatFS_SD_S65.o.d -c ../AT128_FatFS_SD_S65.c avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT ff.o -MF dep/ff.o.d -c ../ff.c avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char...
Kod znalazłem coś kiedyś gdzieś w odległej przeszłości robiłem na arduino więc sobie z kodem poradzę tylko teraz pytanie stricte techniczne ARDUINO UNO R3 ATMEGA328 CH340 czy przy tej płytce wykorzystuję jako wyjście pod komputer gniazdo usb które jest do wgrywania kodu czy muszę zaopatrzyć się w dodatkowy moduł [syntax=arduino]#include "Keyboard.h"...
Witam Nie widzę deklaracji funkcji: delayus() oraz delayms(). W bibliotece delay.h funkcje te wyglądają tak: delay_us() i delay_ms(). Tak naprawdę właśnie dobór opóźnień jest najistotniejszy przy komunikacji po 1-Wire. Wiem bo sam męczyłem się trochę z tym czujnikiem. Niestety funkcję dostępne standardowo w bibliotece delay.h ( delay_us() i delay_ms()...
Masz poniżej zawartość dwóch plików, które trzeba podmienić: [syntax=c] #include <util\atomic.h> #include <util\delay.h> #include <avr\io.h> #include "1wire_basic.h" uint8_t Error; uint8_t PinMask; void OW_SendBit(bool bit) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { DDRB |= PinMask; _delay_us(3); if(bit) DDRB &= ~PinMask; _delay_us(60);...
To ten kod, w bibliotece nic nie zmieniałem #include <SPI.h> #include <max7456.h> #define MAX7456_TABLE_ASCII #include "max7456registers.h" Max7456 osd; byte tab[]={0xC8,0xC9}; void setup() { // put your setup code here, to run once; SPI.begin(); osd.init(6); //Max7456(6); osd.setDisplayOffsets(60,15); osd.setBlinkParams(_8fields, _BT_2BT);...
Hej, Próbuje zbudować urzadzenie, które znalazłem w internecie. Pomysł opiera się na stworzeniu zestawu urządzeń LED, które użytkownicy muszą dezaktywować za pomocą czujnika zbliżeniowego tcrt5000. Po dezaktywacji jednego urządzenia, inne urządzenia losowo zostają aktywowane, zapalając diody LED jedno po drugim. Chciałbym was podpytać o pare rzeczy...
Na próbę zrób: [syntax=c] #define F_CPU 12000000UL #include <avr/io.h> #include <util/delay.h> int main (void) { DDRA |= 0xff; DDRD |= 0xff; TCCR1A |= 0x40; //włączenie przełączania portu OC1A TCCR1B |= 0x0A ; //włączenie trybu CTC, ustawienie preskalera na 8 OCR1A = 7499; while(1) { } }[/syntax] i sprawdź, czy są zmiany na pinie D5.
ISR(INT2_vect) //procedura obslugi przerwania { impulsy++; } A czy zadziała: (chyba powinno ;)) SIGNAL(SIG_INTERRUPT2)// gdy nastąpi przerwanie na wejściu INT2, wykonuje to co w klamrach { impulsy++; // każde przerwanie powiększa zmienną impulsy o 1 // tu wpisz swoją funkcję - opóźnienie o 40 milisekund } Ale spróbuj też w tym swoim...
Wyeliminuj delay(40),sprobuj zwiekszyc bufor,zmien na if((pos... else if((pos...
Jeżeli w programie występuje konieczność odmierzania czasu ATmega musi mieć swój "zegarek" na którym będzie ten czas odmierzał. Tym zegarkiem jest Timer, natomiast funkcje typu delay() wstrzymują tylko wykonywanie programu.
No to trzeba zakodować coś takiego: f0:=261; f:=1046; repeat IF Klawisz1 then f0:=261; IF Klawisz2 then f0:=392; IF Klawisz3 then f0:=523; IF Klawisz4 then f0:=587; IF Klawisz5 then f0:=659; IF Klawisz6 then f0:=1046; przyrost:=f0-f; {Ograniczenie przyrostu} if przyrost > 5 then przyrost:=5; if przyrost...
(at)mocnyamper Sprawdzałem trzy razy. Ale jak troszkę grzebałem w tym kodzie, to zmieniając funkcję loop na [syntax=c] pwm_on = true; delay(100); pwm_on = false; delay(100); [/syntax] to wtedy czujnik pokazuje mi "ciągłe" przychodzenie danych.
Problem masz gdzieś indziej. W kompilatorze Codevision funkcja systemowa delay ma wewnątrz kasowanie watchdoga. Spróbuj zamienić ją na pętlę while(1); a powineś zuważyć efekt zadziałania watchdoga.
Wkleje plik includowany z obsługa LCD, który stosuje oraz czesc programu głownego: LCS.asm: ;=======================================... ; Obsluga LCD zgodnego z HD44780 dla 8-bitowej szyny danych v1.0 ; Nie obsluguje BUSY flag ani odczytu adresu z LCD ;!!! Znak lub komenda do wyslania do LCD przekazywane sa przez...
No dawanie w przerwaniu delaya to nie jest dobry pomysl ;)
Połączyłem też przewód sterowania z masa i wyjściem uC... Nie miałeś łączyć przewodu sterowania z masą tylko masę zasilania serwa z masą zasilania mikrokontrolera. Jeśli zasilasz to wszystko z tego samego napięcia to taki zabieg nie jest konieczny, aczkolwiek to niezbyt dobre rozwiązanie. Przewód sterowania musi być połączony tylko z wyjściem mikrokontrolera....
Pytałem co się dzieje bo może błąd jest gdzie indziej ;) Idee, wydaje mi sie załapałem. Z jakimi opcjami kompilujesz? A co się dzieje z tymi zmianami? Czy to może być wina rezonatora kwarcowego ? Używam zewnętrznego 16{MHz} No to zamrugaj sobie diodą na początku ;) ... dodałem kod... jak masz podłączoną te diode? Masz jakiś miernik, próbnik logiczny,...
Co do wysyłana szesnastkowych wartości przez RS'a. Możesz użyć funkcji sprintf(); Wyglądało by to następująco: sprintf ( Bufor, "%X:%X:%X:%X:%X:%X", MAC[0], MAC[1] .......); Bufor powinien mieć wielkość 6*3 bajtów. Zostanie w nim zapisana np. tak postać: "0C:2A:......" Aby wykorzystać tą procedurę musisz dołączyć stdio.h. Tu pojawiają się pewne schody....
Swoją przygodę z Arduino zaczynam od takiego oto błędu po kliknięciu "Zweryfikuj": Arduino:1.8.2 (Windows 10), Płytka:"Arduino Nano, ATmega328" avr-g++: error: cannot access device-specs for 'atmega328p' expected at 'device-specs/specs-atmega328p' avr-g++: note: devices natively supported: ata5272 ata5505 ata5702m322 ata5782 ata5790 ata5790n ata5791...
...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...
Tiemery są lepsze bo proc nie czeka bezczynnie, cały czas może sprawdzać inne we/wy. delay() zatrzymuje Ci proca, jak sleep ,wait itp. w innych językach.
Funkcja delay_ms() nie zależy od timera, więc prescaler nie ma dla niej znaczenia.
panie, lampa alladyna ----> jak już tworzysz własną funkcję delay_ms to nie rzucaj sobie kłód pod nogi, poczytaj o typach danych, stosuj je z głową w mikrokontrolerach, bo widać że chyba jeśli chodzi o C to na razie wiedzę opierasz tylko na książkach z języka C dla PC'tów, gdzie takie problemy się nie liczą.... [syntax=c]void delay_ms( uint16_t ms )...
Kod jest poprawny. Czy w projekcie masz wybrany prawidłowy procesor? A co do delay to pewnie masz źle ustawione F_CPU.
Poszukałem i znalazłem prosty programik w C dla AT90S8515 z kwarcem 8 MHz mrugający diodą LED. Dokonałem małej zmiany (częstotliwość kwarcu), kompilowałem go za pomocą avr-gcc pod linuksem, zaprogramowałem mikrokontroler ATmega8 za pomocą uisp i STK200 i... działa z wewnętrznym oscylatorem 1 MHz. Dioda LED jest przez rezystor podpięta anodą do +5V i...
Usunąłem kod obsługujący drugi kanał, bo była jakaś interferencja pomiędzy kanałami w wyświetlaniu. Powinno działać w miarę dobrze (sprawdzane na symulatorze): [syntax=c]#include <Adafruit_NeoPixel.h> //#define DEBUG_TEST_LEDS #define nonLinearLogAudio //#define DEBUG_PRINT_ANALOGVALUES //#define DEBUG_NO_PEAK_SWITCH const int useSensorValues...
Używam dokładnie tego samego LCD. U siebie po pierwsze po inicjalizacji, przed wysłaniem komendy czyszczenia (pierwszej jakiejkolwiek komendy) daję delaya 100ms. Po drugie, linię R/W mam zwartą do masy (czyli na stałem sam zapis) - i tak w Twojej bibliotece nie widzę komend odczytu ;) A po trzecie spróbuj linie RS i EN przepiąć na inne piny. Dokładnego...
Nie jest to lepszy przykład. Jak widze te delay_us w przerwaniach to aż mnie skręca. Z całym szacunkiem ale nasuwa mi się tylko jedno słowo: amatorszczyzna. Jeżeli Ci się wydaje, że robisz coś przełomowego i odkrywczego to chciałbym Cię uświadomić, że jesteś w błędzie. Finalną wersje optymalizacji można będzie zobaczyć w EP, to jest szybka poprawka...
Całą naukę związaną z błędem już przyswoiłem. Tabele logiczne już wiszą nad biurkiem. Budowa układu jednak dalej trwa i generuje problemy. Nie chcę zakładać następnego tematu, dlatego będę kontynuował pisanie w tym. Kod z pierwszego postu po poprawkach działa bardzo dobrze. Mimo generowania oscylacji, pomiar jest wystarczająco dokładny. Jednak dalej...
nie zagłebiajac sie w kod, wydaje mi sie ze to jest ten delay_ms. ma prawo wystepowac cos takiego ze siedzisz w delay'u to juz sie zmienil czas ale minie spory kawałek sekundy zanim odswiezysz wyswietlacz.. na test usun delay'a, jak pomoze to zrob to czekanie na timerze
Z tego co pamiętam, to LCD i tak by Ci działał na takim delayu (dłuższym 2.5x) One mają tylko minimalne czasy podane:> HEXa nie pozwoliło dodać - dodaję BINa:) Skompilowane pod kwarc 4MHz.
W celu eliminacji drgań styków należy użyć przerwania licznika, by odczytywać stan przycisku tylko raz na około 10 ms . Nie używamy funkcji Debounce i delay_ms ! Czy przycisk został naciśnięty sprawdzamy w zmiennej globalnej dostępnej w programie głównym.
Ale teraz jak mam funkcje do migania diodą co sekundę to znowu miga jak powalona :/ jak sobie tą funkcje umieszcze w while i tam mam ze ma zmieniac co sekunde stan. No to porównaj, to co dołożyłem, z tym co było i dorzuć w swoim programie tak samo odpowiedni plik nagłówkowy na początku oraz <wdt_reset();> na początku pętli głównej, albo wyłącz...
Myslalem tez nad czyms takim . 1.Narastajace zbocze na INT0, start timera ostawionego na przepelnienie po 1 ms i w przerwaniu od przepelnienia ustawiam PA2 na 1, a petli głownej sprawdzanie stanu PD2 pod katem wystapienia stanu niskiego i ustawinie PA2 na 0 drugi sposob 2. Bez przerwan, tak jak mialem na poczatku w programie z delay tylko ze po pierwszym...
Spróbuj tak: [syntax=c] #include <avr/io.h> #include <util/delay.h> #include "HD44780.h" #include <stdlib.h> #include <string.h> #include <avr/pgmspace.h> int main(void) { char *LINE = PSTR("Jakiś tam sobie tekst"); char i=0; LCD_Initalize(); LCD_Clear(); LCD_GoTo(0,0); for(i=0;i<10;i++) { LCD_WriteData(pgm_read_byte(LINE+i));...
Może ten fragment z Helpa od PonyProga rozwiąże Twój problem. Q: I can't program ATmega, I always got "Write failed message". Q: I can't program AVR AT90Sxxx, I receive error -21 and the program fails. What is the problem? A: Increase the following parameters in the ponyprog.ini file (all times are in milliseconds) AVRByteWriteDelay=30 'Delay to complete...
Funkcje napisane przez mojego profesora Dużo nauki przed nim. nie chce mieszac poprostu chce mu oddac zapis i odczyt z 24C32 i tyle zrób wiec tak: [syntax=c] start(); if (status & 0xF0 != 8) return( BLAD_START ); write( adres ); if (status & 0xF0 != ?? ){ stop(); return( BLAD_ADRES ); } write( dana ); if (status & 0xF0 != ?? ){ stop(); return( BLAD_DANA...
A zadeklarowała gdzieś zegar w tym drugim projekcie? Pewnie tak, bo dostałbyś ostrzeżenie z modułu delay. No to procek Ci pewnie nie działa albo masz ustawione źle fusebity i procek nie skacze z bootloadera do programu głównego. Od tego są stosowne fusebity. R
Podczas programowania musisz wyłączyć fusebit odpowiedzialny za podział zegara przez 8, który fabrycznie jest aktywny. W ATmega 8 nie ma takiego fusebitu. Trzeba zmienić LowFuse z E1 na E4.
Straszny ten kod jest. Przykładowo - po co jest coś takiego: [syntax=c]for(;;) while(1)[/syntax] albo to: [syntax=c]if( ! (PIND & (1<<PD3)) ) //tutaj sprawdzam trzeci bit z portu D { _delay_ms(200); //czekam, aż drgania styków ustaną n=n+1;[/syntax] Zastanów sie czy ten delay ma jakiś wpływ na drgania. Czy nie lepiej po tym delayu raz 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?
Przepraszam literówka. Zastanawia mnie czy to by działało. [syntax=c]#include "BluetoothSerial.h" BluetoothSerial SerialBT; String MACadd = "AA:C0:31:44:70:8F"; uint8_t address[6] = {0xAA, 0xC0, 0x31, 0x44, 0x70, 0x8F}; String name = "SL-FXX-K EVO"; bool connected; void setup() { SerialBT.begin("ESP32", true); connected = SerialBT.connect(name); //connected...
Witam, Mam problem i nie mogę znaleźć odpowiedzi, sam nie wiem co może być nie tak i w internecie na forach nie widziałem podobnego problemu. Mianowicie. Zaprojektowałem układ elektroniczny do sterowania zaworami, zawór działa na 24V i prąd około 63mA. Zawór załączany jest przez tranzystor 2N2222A. Sercem sterownika jest ATMega328P-PU, wszystkie podstawowe...
nadal nie zrozumiałeś [syntax=c] if (przycisk włączony) delay if (przycisk włączony) do something (tab = pind) [/syntax]
Witam Serdecznie Na początek kod: [syntax=c]#define F_CPU 4000000UL #include <avr/io.h> #include <avr/iom128.h> #include <util/delay.h> #include <avr/interrupt.h> volatile uint8_t i=0; int main(void) { DDRA = 0xFF; ASSR &= ~(1<<AS0); TCCR0 |= (1<<CS01) | (1<<CS02); TIMSK |= (1<<TOIE0); TCNT0 = 131;...
CPI r24, 4BRSH wylacz_usypianie...wylacz_usypianie:CLI.... Kod: avrasm ] CPI r24, 4BRSH wylacz_usypianie...wylacz_usypianie:CLI.... Powiem szczerze, że nie bardzo rozumiem. Obecny kod wygląda w ten sposób: [syntax=c]/* * main.c * * Created: 2/14/2022 1:11:10 PM * Author: Maciej */ #include <xc.h> #include <avr/wdt.h> #include <avr/interrupt.h>...
Niestety ale nie mogę zrezygnować z delay_ms ponieważ jest to ,,obowiązkowy punkt programu,, Poszukaj na forum kodu multipleksującego wyświetlacze LED w oparciu o przerwanie od timera. W pętli głównej zrobisz sobie opóźnienie, test stanu przycisku i zmianę zawartości wyświetlanych znaków. Niestety ale nic nie znalazłem...
Nie rozumiem. Dlaczego bez optymalizacji nie ma błędów i w AVR_Studio 4 też nie ma błędów? [url=http://mikrokontrolery.blogspot.com... Użyj timera, większy zysk.
Używam AtmelStudio. Tak te błędy są związane z brakiem ; na końcach poszczególnych linijek kodu, zmianą #define PRZYCISK_DOWN (PINC & PRZYCISK_CZAS) na #define PRZYCISK_DOWN (PINC & PRZYCISK) oraz z brakiem biblioteki #include <util/delay.h> Ok. Natomiast pozostaje problem z zapisem i odczytem pamięci. Z tego co rozumiem, a okazuje się,...
Opóźnienia nie są krytyczne - masz przecież zegar sterujący transmisją. Więc zamiast 4us (o ile to opóźnienie istotnie tyle miało) możesz dać większe - chodzi tylko o to, aby CLK nie miało częstotliwości wyższej niż akceptowana przez SHT dla danego rezystora podciągającego. Co do samego delay - działa ono w ten sposób, że wartość opóźnienia jest przeliczana...
nie usuwaj tablicy wektorów i całej reszty z której rezygnujesz przy opcji -nostartfiles. skrócenie IVT w celu oszczędzania pamięci Kombinuję dalej, w tabeli dane2 mam wrzucną zawartość hex'a programu, który miga diodą z delay'em (mało ważne), ok 230bajtów, bootloader ładuje mi tylko 1 stronę: Dodano po 20 Ok, gdy zapisuję drugą stronę to muszę zrobić:...
Ja bym na twoim miejscu najpierw zrobil tak: - napisalbym prosty program migania ledem - w AVR studio trzeba wybrac jaki sie ma procesor i jaki kwarc (lub uklad RC) - nastepnie wyslac program do procka - tez trzeba wybrac jaki to procek Jak atmega jest nowa to nie zawsze trzeba zmieniac FUSE bity zeby zaswiecic diodke - pojdzie na wewnetrznym RC ale...
Programowo nie da się jej zmienić....... Weź chłopie daj wszystko jak było, tylko BAUD daj 4800 i sprawdź, czy przy takiej prędkości działa #define F_CPU 1000000ul #include <avr/io.h> #include <util/delay.h> #include <avr/signal.h> #define FOSC 1000000 #define CZYT 50 #define BAUD 4800 #define MYUBRR FOSC/16/BAUD-1 void USART_Init(...
Masz rację - powinno być 0 przy zapisie. Mimo wszystko to nie pomogło. Wiem, że w moim przypadku trzeba najpierw dać warunek startu, potem adres slave'a, dane do zapisu i warunek stop. Czyli transmisja powinna wyglądać tak: M-> START M-> adres PCFa i ZAPIS-czyli "0" S-> ACK M-> DANE (u mnie 0x00, żeby ustawić same 0) S-> ACK M-> STOP Czy master (ATMega)...
W pliku 'lcd.h' : #1 Usuń wszystkie 'inline' . #2 Zamiast: typedef struct LCD_LOCAL { uint8_t matrix[8]; // Matryca znaku char cAlt; // Znak alternatywny }LCD_LOCAL_PGM PROGMEM; napisz: typedef struct { uint8_t matrix[8]; // Matryca znaku char cAlt; // Znak alternatywny }LCD_LOCAL_PGM; W pliku 'local.h' : Zmień: extern...
delay atmega funkcja delay przerwanie delay
instrukcja kuchenka gazowy amica silnik my1020 motorola wyświetlacz pasek
technika radiowa technika radiowa
STN1170 i EEPROM - wygląd i funkcje Brak prądu w gniazdkach, światło działa - przyczyny