STM32F10x ADC ile okunan değeri UART ile PC ye gönderme

Başlatan furkanyx, 16 Ocak 2017, 00:07:07

furkanyx

Merhaba arkadaşlar,
Stm32f10x serisi denetleyici ile ADC den okunan değeri UART ile göndermek istiyorum. ADC den okunan değeri DMA ile hafızadaki bir değişkene basıyorum UART DMA ile de bu değişkenin içeriğini göndermeye çalışıyorum. Fakat saçma sapan anlamsız değerler geliyor UARTtan. Nerede hata yapıyorum veya mantık mı yanlış? neler yapabilirim? DMA olmadan interrupt ile ADC dönüşüm yaptğında bulunan değeri UARTtan yolladığımda sıkıntı yoktu fakat dezavantajı işlemci başka iş yapamıyordu. En basidinden led yak söndür bile yapamıyordu bu yüzden DMA yolunu tercih ettim. UARTtan ADC den bağımsız değerler yolladığımda sıkıntısız gidiyor. ADC dönüşümü 16 bit, uart 8 bit data yollayabiliyor. DMA ile bu datayı nasıl iki parça halinde gönderebilirim. Kafamda deli sorular... Yardımcı olursanız sevinirim.  :)

kantirici

ADC örnekleme frekansınız ne ?  Bir saniyede ne kadarlık bir örneklemeye ihtiyacınız var ve bu veriyi nerede nasıl kullanıyorsunuz ? UART hızınız kaç ? Kesmenin sıkıntı çıkartması algoritmik bir sıkıntıya işaret bence.

magnetron

önce 16 bitlik sayıyı hexe çevir

mesela  3500 -> 0DAC sonra
arka arkaya 0 ın ascii kodu olan '0' karakterini sonra D nin ascii kodu olan 'D' karakterini
falan arka arkaya gönder

paketin en sonuna da paketin bittiğini anlatan mesela 0Xff karakterini gönder

bu paket PC ye gelince ascii kodlarını tekrar hexe çevirip bir değişkene yazdır

furkanyx

@kantirici hocam, ADC ile daha önce uğraşmadığımdan kesmeyi resimdeki gibi yazdım. Örnekleme frekansı olarak "ADC_SampleTime_239Cycles5" seçeneği seçtim.


@magnetron hocam, yüklediğim resimdeki gibi aldım. PC de çevrim yapıyorum. Fakat sorunum şu; işlemci başka bir işle uğraşmadan sadece adc den aldığı verileri uart a basıyor. Ayrıca yapması gerek işleri yapmıyor. Ben hem adc den veri alıp uart a yollamak istiyorum hemde main fonksiyonum içindeki başka işleri de yapmak istiyorum.

magnetron

interrupt rutini içinde interrupt flag' leri temizledin mi ?
şöyle bişey olması lazım

    ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);

furkanyx

Hocam attığım kod parçasıyla çok rahat pottan falan veri okuyabiliyorum. Tahminimce yani önceki deneyimlerimden o flagler temizlenmeseydi adc bir kere interrupta girerdi ve sadece tek seferde veri okuyabilirdim. Dediğinizi de denemiştim fakat fark etmediğinden dolayı son hali resimdeki gibiydi. Benim görüşüm ADC çok fazla kesme isteği yolluyor ve işlemci sürekli kesmelere girdiğinden main deki işlerini yapamıyor. DMA ile denedim başarılı olamadım.