Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie syntezą LM7001 z Arduino
SQ8MVY Offline
Paweł
****

Liczba postów: 724
Dołączył: 30-07-2011
Post: #16
RE: Sterowanie syntezą LM7001 z Arduino
(25-02-2017 20:34)SP7EZG napisał(a):  
Kod:
.......
   if ( ( Sterowanie << idy ) & 0x0001 )
......

Wygląda na to, że wartość nie jest zapisywana poprawnie.

Wcale się nie dziwię. Masz w wyrażeniu babola. Dlaczego przestawiłeś kierunek przesuwania bitów << w lewo ?? Jakiś konkretny cel miałeś ??

Jeżeli chcesz bity przesuwać w lewo to powinno to wyglądać tak:
Kod:
if( ( Sterowanie << idy ) & 0x8000 )
{....

Napisałem coś takiego na podstawie dokumentacji LM7001. Sprawdź sobie, bo mogą być błędy.
Kod:
#define DATA 7
#define CL 6
#define CE 5

#define KROK_100K 0b00000000
#define KROK_50K  0b00000100
#define KROK_25K  0b00000010
#define KROK_5K   0b00000110

#define StartFreq       5394        //StartFreq=(145550-10700)/25=5394


void setup()
{
  pinMode(DATA, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(CE, OUTPUT);

  digitalWrite(CL, LOW);
  digitalWrite(CE, LOW);
  digitalWrite(DATA, LOW);

  synteza( StartFreq, KROK_25K );
}


void loop() {

}


void synteza( uint16_t Fpom, uint8_t krok )
{
  Fpom &= 0x3fff;  // Tu zadbamy o to, by bity 15 i 14 były zawsze wyzerowane

  uint32_t sterowanie = ( (uint32_t)1<<23 ) | ( (uint32_t)krok<<20 ) | ( (uint32_t)7<<16 ) | Fpom ;
  
  digitalWrite(CE, HIGH);

  for( uint8_t idx=0; idx<24; idx++ )
  {
    if( ( sterowanie >> idx ) & 0x00000001 )
    {
      digitalWrite(DATA, HIGH);        
    } else
    {
      digitalWrite(DATA, LOW) ;        
    }
    zegarek();
  }
  digitalWrite(CE, LOW);
  digitalWrite(DATA, LOW);
}


void zegarek()
{
  delay(10);
  digitalWrite(CL, HIGH);
  delay(10);
  digitalWrite(CL, LOW);
  delay(10);
}

Nie posiadam tego LM-a, więc są to moje przemyślenia. Kompiluje się prawidłowo. Działać chyba też powinno.

Funkcja synteza przyjmuje 2 parametry. Obliczony dzielnik dla częstotliwości, oraz krok strojenia.
W środku jest składana kompletna ramka, która jest wysyłana..

Co do enkodera. Tu najlepiej użyć przerwań, tak jak to jest zrobione w oryginale i koniecznie trzeba podłączyć enkoder poprzez prosty filtr RC.
Odpadnie wówczas problem z drganiem styków - jeżeli to enkoder mechaniczny.
Nie zapomnij oglądnąć i poczytać ten poradnik dotyczący enkodera

Gorąco polecam również pozostałe poradniki Pana Kardasia, bo widzę, że jesteś na samym początku drogi nauki programowania....

73 Paweł
(Ten post był ostatnio modyfikowany: 25-02-2017 21:59 przez SQ8MVY.)
25-02-2017 21:59
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Sterowanie syntezą LM7001 z Arduino - SQ8MVY - 25-02-2017 21:59

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości