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.
Dawno nie bawiłe się arduino ale coś jescze pamiętam. Aby używać zmiennych uint8_t musisz dołączyć plik nagłówkowy [syntax=c]#include "U8glib.h"[/syntax] Następnie radzę dla wejścia (pin1) zastosować podciągnięcie do plusa programowo. [syntax=c]pinMode(pin1, INPUT_PULLUP);[/syntax] Proponuję zastosować taki kod (nie używam adruino więc nie mogę go sprawdzić):...
Zmień delay na 250 ms...
No, to tylko część modyfikacji, trzeba przerobić cały plik na "arduinowy" bo nie widzi że to jest dla LGT tylko robi jak dla Atmega328P, a on nie ma takich rejestrów. No i resztę funkcji, bo odczyt musi być też między ustawieniami rejestrów: https://obrazki.elektroda.pl/8960353100_... Może inicjalizacje IO można zostawić poprzednią...
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.
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.
chodzi płynniej bo w jego kodzie nie ma instrukcji delay(400)
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,...
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...
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...
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));...
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>...
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); } }
Ż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....
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...
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.
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ć.
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
Coś takiego znalazłem. Co prawda na Atiny ale można przerobić. [syntax=c]// // Talking to ultrasonic sensor HC-SR04 with an ATtiny84, and // sending distance data using serial communications. // // electronut.in // #include <avr/io.h> #include <string.h> #include <util/delay.h> #include <avr/interrupt.h> #define F_CPU 8000000...
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ć...
Zdziwienie- nie. Ale mateusz powinien się uczyć prawidłowo programować- więc bez goto i delay. No- delay i goto- może potem.
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...
Sprawdzona [syntax=c]/* * dht11.h * * Created on: 23 mar 2014 * Author: miszczo * http://mikrokontrolowanie.elektroda.eu/d... */ #ifndef DHT11_H_ #define DHT11_H_ //--------------------------------------... //**************************************...
(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...
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
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.
Są 3 możliwości: 1. Delay ma ograniczenia (nie znam Arduino), ale tutaj nic nie jest napisane: http://arduino.cc/en/Reference/Delay 2. Masz włączony preskaler rejestrem CLKPR – Clock Prescale Register ale tego nie widać w programie. 3. Fusebity ustawione sa na wewnętrzny generator 8MHz, a nie na zewnętrzny kwarc. Tak jest w Twoim przypadku. Łatwo...
(at)R-MIK Robienie krótkich impulsów na timerze w ATMega jest bez sensu, bo ten timer nie ma trybu one-shot. Do tego celu trzeba kreatywnie wykorzystać inny układ peryferyjny... Oczekujesz, że podeślemy ci gotowy kod, który ty pod swoim nazwiskiem opublikujesz jako przełomowe odkrycie?:) Może by i tak było, gdybyś w międzyczasie nie zraził do siebie...
(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);...
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.
Zmienna count powinna być volatile .
Zrobiłem sobie troszkę testów, i zajrzałem po raz kolejny do datasheeta, znajdując tam taki obrazek https://obrazki.elektroda.pl/7236609300_... Spróbowałem to zastosować w kodzie: Dodano po 56 Przy okazji usunąłem digitalwrite, i nic się nie zmieniło
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...
Witam, mam taki kod programu: [syntax=c] #include <avr/io.h> #include <avr/eeprom.h> #include <avr/pgmspace.h> #include <avr/interrupt.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <util/delay.h> volatile uint8_t t1=5; volatile uint8_t t2=5; volatile uint8_t t3=5; volatile uint8_t...
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....
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"...
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);...
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.
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...
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...
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.
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....
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.
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....
...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.
[syntax=c]#include "TWI.h" #include <avr/io.h> //#include <util/delay.h> #define BAUD100000 //######################################... void TWI_Init(void) //Inicjalizacja wyłącznie prędkosci interfejsu TWI dla f = 11059200 Hz { TWCR = (1<<TWEN)|(1<<TWEA); TWBR = ((F_CPU/BAUD)-16)/2;...
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...
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
Witam W jaki sposób mogę przenieść program TriangleWave.ino z tego linku: http://www.instructables.com/id/How-to-M... na ATmegę16A? Wygląda on tak: http://obrazki.elektroda.pl/4752241700_1... Schemat mojego układu daję w załączniku. Na moim schemacie brakuje transoptora TCST1103(dodałem go jakiś...
Kod jest poprawny. Czy w projekcie masz wybrany prawidłowy procesor? A co do delay to pewnie masz źle ustawione F_CPU.
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...
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...
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;...
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...
No dawanie w przerwaniu delaya to nie jest dobry pomysl ;)
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...
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...
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...
Witam, Tworzę projekt kompasu cyfrowego po szynie I2C pracujących na Atmega 328p-pu. Chciałbym zrealizować u siebie w projekcie przerwania, w ten sposób, że odbieram dane z kompasu->przerwanie i kolejno na początek. Przerwania na prostych przykładach realizowałem ale tutaj nie mam pomysłu jak to zainicjować. Wklejam główny wątek, z moją nie udaną...
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...
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.
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
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. Przedstawię dzisiaj kompletne rozwiązane jak szybko uruchomić za parę złotych własny terminal rs-owy w oparciu o konwerter USB RS232 na układzie scalonym PL-2303HX który można kupić bez problemu na Allegro. http://obrazki.elektroda.pl/9582806900_1... Przykład oparłem na programie putty z domyślnymi ustawieniami dla RS-a. Biblioteka...
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;...
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...
Dlaczego definicje wszystkich funkcji masz w funkcji main? Powinny być przed nią. Raczej nie wykorzystujesz linii Busy/Ready wyświetlacza a cały czas pchasz w niego informacje. Czyścisz go tylko raz. Uzależnij wyświetlanie od jakiejś flagi ustawianej w timerze 2 (np co 0,5s) i wtedy czyść wyświetlacz i wyświetlaj dane. Pewnie dlatego działa Ci z delayem...
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...
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ę,...
Dlaczego nie? Wątek, który podałeś jako przykład to stek bzdur. Przy pomocy delay_ms można realizować opóźnienia bardzo długie, z pewnością przekraczające 3000ms: http://mikrokontrolery.blogspot.com/2011...
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...
delay atmega funkcja delay przerwanie delay
halogen zamiast żarówki centrala alarmowa allegro ic501 funai
schemat kabli radia napęd silnik wycieraczek
Komunikat "96" w Honda CR-V 2016 - co oznacza? Wzmacniacz audio na lampach PCL805 i PL504: Możliwości i wyzwania