Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zegar widmowy - określenie punktu startu

kewert 27 Mar 2016 20:59 603 3
  • #1 27 Mar 2016 20:59
    kewert
    Poziom 13  

    Witam

    W jaki sposób mogę określić punkt startu dla wyświetlacza widmowego? Chodzi mi o coś takiego jak na tym filmie(6:26): https://youtu.be/57carjNxI9A Tutaj jest cały program: http://www.instructables.com/id/How-to-Make-a-Fan-POV-Display/step5/Upload-the-code/ Z tym, że ten projekt jest na arduino i czujniku halla, a ja mam transoptor podłączony do pinu int Atmegi 16A. Program którego używam wygląda tak:

    Spoiler:
    Code:

    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//
    //   This programe for POV massage display   //
    //            For Active LOW             //
    //            Anticlockwise             //
    //           Using Atmega16             //
    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//

    #include <avr/io.h>
    #include <avr/delay.h>

    #define led PORTA

    unsigned int del=5; //use for delay function

    void delay(void)
    {

    _delay_ms(del/2);

    }

    void display(unsigned char car);

    void main()
    {
    DDRA=0xff; //setting the output port

    while(1)
    {
    display('P'); //display R
    display('B'); //display B

    _delay_ms(80); //delay after ending the name

    }

    }

    void display(unsigned char car)
    {
    {
    switch(car)
    {
    case 'B' : // letter B


    led=0x93; delay( );

    led=0x6D; delay( );

    led=0x6D; delay( );

    led=0x6D; delay( );

    led=0x01; delay( );

    led=0xff; delay( );// to make one column gap between letters

    break;

    case 'P' : // letter B


    led=0x9F; delay( );

    led=0x6F; delay( );

    led=0x6F; delay( );

    led=0x6F; delay( );

    led=0x81; delay( );

    led=0xff; delay( );// to make one column gap between letters

    break;

    }
    }
    } // END


    Czy da się w jakiś prosty sposób zmodyfikować program z mojego układu tak, żeby dodać tą funkcję? Moje doświadczenie z programowaniem jest praktycznie żadne i nie bardzo wiem jak można to zrealizować.

    Z góry dziękuję za pomoc.

    Pozdrawiam

    0 3
  • #2 28 Mar 2016 13:57
    BlueDraco
    Specjalista - Mikrokontrolery

    Niezależnie od rodzaju czujnika wykrywanie ponktu odniesienia jest takie samo. Może to być czujnik Halla, może być transoptor.

    0
  • #3 28 Mar 2016 14:07
    kewert
    Poziom 13  

    Próbowałem przepisać fragment kodu odpowiedzialny za tą funkcję do mojego programu ale przy kompilacji są błędy. Nawet próbowałem wgrać cały program z instructables ale po podłączeniu zasilania nic się nie dzieje. Co trzeba zmienić, żeby przystosować program z arduino mini pro do atmegi16a?

    0
  • #4 28 Mar 2016 22:48
    kewert
    Poziom 13  

    Ok, mam już chyba pomysł. Powiedzmy, że wezmę ten kod:

    Spoiler:
    Code:
    int timer = 600;    
    
    int U18 = 7;
    int State = 0;         
    int lastState = 0;       

    void setup() {
      for (int Pin = 2; Pin <=6; Pin++) {
        pinMode(Pin, OUTPUT);}
       pinMode(U18, INPUT);
    }

    void loop() {
      State = digitalRead(U18);
    if (State != lastState){
      if (State == HIGH){
      for (int m=0; m<8; m++){
      for (int Pin = 2; Pin <=6; Pin++) {
        digitalWrite(Pin, HIGH);
        delayMicroseconds(timer);
        digitalWrite(Pin, LOW);
      }

      for (int Pin = 5; Pin >= 3; Pin--) {
        digitalWrite(Pin, HIGH);
        delayMicroseconds(timer);
        digitalWrite(Pin, LOW);
      }}}}
      lastState = State;
    }

    Sprawdziłem w datasheet atmegi 328 z arduino pro mini i okazało się, że rozstaw pinów się nie zgadza z atmegą 16A. Teraz pytanie jakie są odpowiedniki dla pinów Atmegi 16A - INT0 i całego PA? Nie mogę za bardzo tego znaleźć, zwłaszcza że atmega 328 nie ma PA i występuje w obudowie DIP28. Kiedyś widziałem chyba biblioteki dla Arduino IDE z Atmegą16 ale nie mogę tego znaleźć(albo nie wiem co wpisać w google). Były tam zmapowane wszystkie piny tego mikrokontrolera, więc mógłbym po prostu zmienić w programie odpowiednie piny na te których potrzebuję. Znalazłem coś takiego: http://hardwarefun.com/tutorials/use-arduino-code-in-non-arduino-avr-microcontroller ale pomimo wykonania wszystkich czynności i zmiany numerów pinów nic się nie dzieje po wgraniu programu. Daję schemat mojego układu w załączniku. Na schemacie brakuje transoptora TCST1103(dodałem go jakiś czas po wykonaniu podstawowego układu na osobnej płytce przyklejonej klejem termotopliwym) podłączonego do pinu INT0. Na schemacie jest błąd. Procesor to oczywiście ATmega16A.

    0