Skocz do zawartości

bluzman

Użytkownicy
  • Zawartość

    18
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O bluzman

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Lublin
  • Języki programowania
    C, Python
  1. Witam. Chciałbym w programie z przerwaniem uzyskać następujący efekt żeby nie używać delaya: 1. Wywołuję przerwanie przyciskiem 2. W przerwaniu jest odmierzany czas przez Timer w Atmega8 i po np. 1 sekundzie przerwanie się kończy i przechodzi do programu głównego. Rozumiem że należy umieścić przerwanie wewnętrzne w zewnętrznym. Jak napiszę 2 przerwania pod sobą, pod programem głównym to po odpaleniu qC to co 1 s. będzie się włączało i wyłączało? Jak to ogarnąć już w kodzie takim jak poniżej bo gdzieś trzeba ten timer przerwania (np. TIMER1_OVF_vect) umieścić. Dziękuję z góry:) #include <stdio.h> #include <avr/interrupt.h> #define SWITCH (1<<PD3) int main(void) { //inicjalizacja przerwania - przycisk MCUCR |= (1<<ISC10); GICR |= (1<<INT1); //Timer1 TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS12); OCR1A = 31250; TIMSK |= (1 << OCIE1A); DDRD &= ~(SWITCH); PORTD |= (SWITCH); sei(); while (1) { } //kod programu } ISR(INT1_vect) { while(1) { //kod programu w przerwaniu } }
  2. Jeszcze mam jedno pytanie. Przełączyłem czujnik na zasilanie w trybie pasożytniczym, wyświetla 85.0000 stopni i nie zmienia się. W nocie jest napisane, że powinno się dodać tranzystor, ja nie dodałem. Ludzie piszą, że nie dodają tranzystorów nawet przy przewodach do 100m mój ma 3m, czy to może być spowodowane brakiem tranzystora?
  3. To tyz piknie. Ciekawe rozwiązanie. Przyznam, że akurat tak wpisałem na samym początku pisania nie zastanawiając się zbytnio nad wielkością i tak zostało. Zmieniłem też jak właśnie sprawdzałem kod. Moim celem dla zastosowania tego uC (Atmega8) jest termometr + czujnik wilgotności np. DHT11
  4. Już poprawiłem babola. Podaję kod jaki u mnie zadziałał dla potomności #define F_CPU 8000000UL #include <HD44780.h> #include <HD44780.c> #include <ds18b20.c> #include <ds18b20.h> #include <stdio.h> int main(void) { LCD_Initalize(); char bufor[100]; LCD_Clear(); while (1) { //odczyt do zmiennej temp, typ float float temp=ds18b20_gettemp(); //wyswietlenie Temp: na LCD LCD_GoTo(0,0); LCD_WriteText("Temp: "); //wyswietlenie temperatury z dokładnocią 4 miejsc po przecinku sprintf(bufor, "%.4f", temp); LCD_GoTo(6,0); LCD_WriteText(bufor); //wyswietlenie symbolu stopnia LCD_GoTo(14,0); LCD_WriteData(223); //wyswietlenie C LCD_GoTo(15,0); LCD_WriteText("C"); } }
  5. A ja napisałem tak int main(void) { LCD_Initalize(); char bufor[100]; LCD_Clear(); uint8_t temp = 0; while (1) { temp=ds18b20_gettemp(); LCD_GoTo(0,0); LCD_WriteText("Temp: "); float f = temp; sprintf(bufor, "%.2f", f); LCD_GoTo(6,0); LCD_WriteText(bufor); LCD_GoTo(13,0); LCD_WriteData(223); LCD_GoTo(14,0); LCD_WriteText("C"); } } lecz zmienia się wartość przed przecinkiem a po są 2 zera cały czas xx.00 Prościej nie przychodzi mi do głowy niż zastosowanie float.
  6. Obliczeń do końca nie, tzn. wiem jak one liczą, działania arytmetyczne na zmiennych ale dlaczego akurat to zostało zastosowane nie wiem. Gdybym wiedział to bym nie pytał się tutaj o nic. Widzę, że tutaj sensu zastosowania ich nikt nie rozumie, więc zapewne są bzdurą. Schodzimy z tematu powoli. Problemem było wyświetlanie się temperatury na LCD z dziesiętnymi. Staram się wystrugać jakiś bardziej przyjazny i prostszy kod teraz.
  7. Tutaj zacytuję sam siebie z pierwszego postu, nie przeczytałeś dokładnie lub zapomniałeś co pisałem chyba: "Przepisałem z zrozumieniem na tyle ile potrafiłem kod znaleziony w sieci, został trochę zmodyfikowany. Dodałem wyświetlanie temperatury z zmiennej po przecinku na LCD." Nie wiem jak inny się uczą sami takich rzeczy ale jedną z moich metod właśnie jest analiza przykładowego kodu żeby go zrozumieć, wiedzieć na czym polegają działania wykonywane i później wprowadzać modyfikacje lub pisać swój kod.
  8. Ja sam nie do końca rozumiem tych obliczeń i na jakich zasadach się opierają. Na początku napisałem, że to przepisałem z różnych źródeł źródeł, trochę zmodyfikowałem, przeanalizowałem po swojemu. Prawie w każdym przypadku można osiągnąć ten sam cel pisząc program na różne sposoby. Prościej będzie jeżeli podam linki tych źródeł: Tutaj te nieszczęsne obliczenia: https://forbot.pl/forum/topic/3133-problem-z-czujnikiem-temperatury-ds18b20/ Tutaj kod akurat działający bez problemu ale bez możliwości wyświetlania po przecinku http://gotronik.com/2015/08/11/czujnik-temperatury-ds18b20-i-atmega-male-porownanie-z-dht11/ Nie chodziło mi o język Arduino tylko składnię języka programowania na Arduino.
  9. Tak ale nie w tym rzecz czy to uC w Arduino czy czymś innym tylko o składnię języka i w ogóle jaki język jest używany.
  10. Tutaj jest opis dla Arduino ja mam uC i potrzebuję naprawy błędów w czystym C. Tu miałeś rację, zniknęło i do końca nie rozwiązałem problemu. Nie wiem czy o to Ci chodziło ale napisałem tak: int main(void) { LCD_Initalize(); char bufor[100]; uint8_t temp; LCD_Clear(); while (1) { temp=ds18b20_gettemp(); int a, b; double c = temp; c+=0.5; a=c; c-=a-0.5; c=c*10+0.5; b=c; LCD_GoTo(0,0); LCD_WriteText("Temp: "); sprintf(bufor, "%d,%d", a, b); reszta... Teraz zmienia się to co jest przed przecinkiem a po przecinku wyświetla cały czas ,10
  11. Dobrze, To jak ma wyglądać ta część kodu? To miało być do wyświetlenia wartości przed i po przecinku. Rozdzielone. Jak to należy ująć?
  12. Witam. Napisałem kod w języku C żeby uruchomić popularny czujnik DS18B20. Przepisałem z zrozumieniem na tyle ile potrafiłem kod znaleziony w sieci, został trochę zmodyfikowany. Dodałem wyświetlanie temperatury z zmiennej po przecinku na LCD. #define F_CPU 8000000UL #include <HD44780.h> #include <HD44780.c> #include <ds18b20.c> #include <ds18b20.h> #include <stdio.h> int main(void) { LCD_Initalize(); char bufor[100]; uint8_t temp; LCD_Clear(); int a, b; double c = temp; c+=0.5; a=c; c-=a-0.5; c=c*10+0.5; b=c; while (1) { temp=ds18b20_gettemp(); LCD_GoTo(0,0); LCD_WriteText("Temp: "); sprintf(bufor, "%d,%d", a, b); LCD_GoTo(6,0); LCD_WriteText(bufor); LCD_GoTo(14,0); LCD_WriteData(223); LCD_GoTo(15,0); LCD_WriteText("C"); } } Czasem kompilacja przebiega poprawnie a innym wypluwa warning: ../main.c: In function 'main': ../main.c:17:12: warning: 'temp' is used uninitialized in this function [-Wuninitialized] double c = temp; W obu przypadkach wyświetla się to samo: Temp: 0,10 C
  13. Wróciłem do ustawień poprzednich i jednak płytka stykowa nie łączy tak jak powinna. Tak czy siak dlaczego twierdzisz że na PD5 jest zawsze mniej niż 1V skoro wystarczy podać stan wysoki na to wyjście i jest 5V?
  14. Zasugerowałem się tym co napisałeś wcześniej, że na PD5 zawsze napięcie jest <1V Zamieniłem na PB7 i zadziałało
  15. Po zamianie PD5 na PB7 wszystko jest OK, kręci się w lewo i w prawo Czyli złym wyborem był wybór pinu. Dzięki bardzo za pomoc.
×
×
  • Utwórz nowe...