Skocz do zawartości

m471

Użytkownicy
  • Zawartość

    11
  • Rejestracja

  • Ostatnio

Reputacja

2 Neutralna

O m471

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Jest to pułapka programowa, zwiększyłem preskaler i program działa, choć timer zaczyna działać dopiero po minucie... Szczerze mówiąc wydaje mi się, że problem tkwi w programatorze
  2. Trochę późno, ale czy oferta aktualna?
  3. Witam, Po inicjacji Timera, ADC przestaje działać. Przed, oraz w trakcie inicjacji wszystko działa jak należy, co sprawdziłem pułapkami programowymi w postaci funkcji LED() (na piny ADC0-2 podpięte są przez przyciski dzielniki napięć które na wyjściu dają połowę napięcia). Wszystko przestaje działać po włączeniu przerwania Compare Match Timera 1. Początkowo myślałem, że problem tkwi w tym, że program wychodząc z jednego przerwania wchodzi od razu w drugie, jednak dioda po zainicjowanym timerze wciąż świeci połową jasności, po prostu już nie gaśnie. Czy przerwania ADC i timera się w jakiś sposób gryzą? Lub ma ktoś jakiś inny pomysł w czym może tkwić problem? Kod: #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <util/atomic.h> #include <util/delay.h> volatile int adc; volatile int MUX_tmp; volatile char adc_arr[3]; void ADC_init(void) { ADMUX|= ( _BV(REFS0) ); ADCSRA|= ( _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)); DIDR0 |= 0x3F; } void LED(void) { while(adc<=300) { PORTB|=_BV(PB0); PORTB=0; } while(adc>=500){}; PORTB=0; } void Timer_init(void) { TCCR0A|= (_BV(COM0A1) | _BV(COM0B1) | _BV(WGM00) | _BV(WGM01)); LED(); _delay_ms(32); TCCR0B|= (_BV(CS00)); LED(); _delay_ms(32); TCCR1B|= (_BV(WGM12) | _BV(CS10)); LED(); _delay_ms(32); OCR1AH|= 0b1001000; LED(); _delay_ms(32); TIMSK1|= _BV(OCIE1A); LED(); _delay_ms(32); } ISR(ADC_vect) { adc=ADC; MUX_tmp=ADMUX & 0xF; adc_arr[MUX_tmp]=adc; if(MUX_tmp <= 3) { ADMUX=(MUX_tmp+1) | _BV(REFS0); MUX_tmp= ADMUX & 0xF; } else { ADMUX=_BV(REFS0); } ADCSRA|= _BV(ADSC); } volatile int Flag=0; ISR(TIMER1_COMPA_vect) { Flag=1; } int main(void) { sei(); ADC_init(); ADCSRA|= _BV(ADSC); DDRB|= _BV(PB0); LED(); _delay_ms(32); LED(); _delay_ms(32); Timer_init(); LED(); _delay_ms(32); while(1); { LED(); _delay_ms(32); } } Nie widzę potrzeby w wrzucaniu schematu, do PB0 podłączona jest dioda, do pinów ADC wspomniałem wcześniej a reszta mikrokontrolera podłączona jest prawidłowo. Z góry dziękuję za odpowiedź Pozdrawiam Ps: Jest to wycinek programu, więc niektóre zmienne mogą zdawać się bezużyteczne (jak np int Flag)
  4. @Treker Okej rozumiem że to błąd, nie w tym problem. Póki co, do mikrokontrolera zamiast silników podłączyłem diody i okazało się że prąd nawet nie płynie. Stąd zastanawiam się, czy wina leży w kodzie, np błędna inicjacja, czy w płytce, przez co mikrokontroler nie może działać poprawnie
  5. Witam, Mam problem ze światłolubem, otóż układ na płytce nie działa. Nie wiem czy to problem w kodzie (wiadomo że czasem drobna "literówka" może zdyskwalifikować cały projekt, a moje początkujące oko niczego nie widzi), czy z płytką, czy w ogóle z elektroniką. Załączam kod (C) oraz schemat (nie widać zasilacza, napięcie jest stabilizowane do 5V). Z góry dziękuję za pomoc Pozdrawiam Kod: #include <avr/io.h> #include <avr/interrupt.h> volatile signed int tmp1, tmp2; //tmp1 lewy czujnik void timer_init() { TCCR1A|= (_BV(COM1A1) | _BV(COM1B1)); OCR1A= 0; OCR1B= 0; TCCR1B|= _BV(CS10); TCCR1B|= (_BV(WGM12) | _BV(WGM10)); DDRB|= ( _BV(PB1) | _BV(PB2) ); } void ADC_init() { ADCSRA|= ( _BV(ADEN) | _BV(ADIE) ); ADMUX|= ( _BV(REFS0) | _BV(ADLAR) ); } ISR(ADC_vect) { if(ADMUX & 1) { tmp2=ADCH; } else { tmp1=ADCH; } ADMUX^= 1; ADCSRA|= _BV(ADSC); } int main(void) { timer_init(); ADC_init(); DDRC=0x00; PORTC=0x00; DDRD=1; PORTD=0; sei(); ADCSRA|= _BV(ADSC); while(1) { while(tmp1<=500 || tmp2<=500) //swiatło świeci { while(tmp1-tmp2>10) //światło na lewym mocniejsze { OCR1A=256; OCR1B=0; } while(tmp2-tmp1>10) //na prawym { OCR1A=0; OCR1B=256; } while((tmp1-tmp2<=10) ) // nieduża różnica { OCR1A=128; OCR1B=128; } OCR1A= 0; OCR1B= 0; } } } Schemat:
  6. Witam Czy testował ktoś z was tą bibliotekę na kontrolerze SH1106? https://github.com/Sylaina/oled-display Zastanawiam się czy problem leży w wadliwym kontrolerze czy problemie z biblioteką (obstawiam opcje pierwszą jednak pytam dla pewności) W przypadku takiego kodu zapala się dioda podłączona do PD1 i nic dalej się nie dzieje: int main(void) { DDRD|=1; PORTD|=1; lcd_init(LCD_DISP_ON); DDRD|=1; PORTD|=1; lcd_puts("Hello World"); } Natomiast w tym przypadku dioda się nie zapala int main(void) { lcd_init(LCD_DISP_ON); DDRD|=1; PORTD|=1; lcd_puts("Hello World"); while(1) } Używam atmegi88PA, z góry dziękuje za pomoc Pozdrawiam
  7. Witam, napisałem prosty program na atmege88pa i nie działa on poprawnie. Od kilku godzin nie mogę znaleść błędu, kompilowałem na eclipse oraz atmel studio i próbowałem kod na dwóch procesorach, dioda cały czas świeci, załączam kod i z góry dziękuję za pomoc. #include <avr/io.h> #include <avr/interrupt.h> volatile int z = 0; void LED() { int l = z; while(l==z){PORTD|=1;} } void LED2() { int l = z; while(l==z){PORTD=0;} } ISR(PCINT0_vect) { uint8_t pin = PINB; if((pin ^ 0x1F)) { z^=1; } } int main() { DDRB=0; PORTB|=0x1F; DDRD |= 2; PORTD = 0; PCICR|= _BV(PCIE0); PCMSK0 |= ( _BV(PCINT0) | _BV(PCINT1) | _BV(PCINT2) | _BV(PCINT3) | _BV(PCINT4) ); while(1) { LED(); LED2(); } }
  8. Jak w takim razie przygotować w eagle miejsce do przylutowania tej wstążki?
  9. Tak jak w temacie, nigdzie nie mogę znaleźć biblioteki CAD do żadnego z w.w. kontrolerów.
  10. Do SSD1306 dokumentacje znalazłem, z tym ze on w przeciwieństwie do wymienionego przeze mnie wcześniej kontrolera ma 64 a nie 32 rzędy
  11. Witam, nigdzie nie mogę znaleźć informacji na temat tego kontrolera, wie ktoś co to za kontroler lub najlepiej ma do niego dokumentacje?
×
×
  • Utwórz nowe...