Witam, próbuje zrobić prosty generator DDS na procesorze ATtiny2313.
Do mikrokontrolera podpinam drabinke R2R (nie gotową tylko polutowaną z rezystorów), dokładnie tak jak przedstawia to rys.:
http://www.scienceprog.com/wp-content/uploads/2008i/DDS2/AVR_DDS_2_0_circuit.png (zamiast portu A jest B).
Za drabinką w miejsce DDS_OUT zamiast tego układu ze wzmacniaczami wrzucam rezystor podpięty do masy. I to na nim robie pomiary na oscyloskopie. Na wyjście portu wyrzucam poszczególne liczby z tabeli, wg. kodu znalezionego w necie (załącznik). Wszystko jest w porządku do pewnego momentu. Najpierw rośnie mi napięcie, a gdy dochodzi do wartości szczytowej i mam od początku wysyłać dane (kolejny przebieg sygnału) powstają jakieś krzaki. Później znów się stabilizuje i napięcie narasta, po czym znów są krzaki i tak w kółko (rysunek).
![[Attiny2313][C/AVR Studio] Problem z DDSem na Attiny2313 [Attiny2313][C/AVR Studio] Problem z DDSem na Attiny2313](https://static2.elektroda.pl/img/preloader2.svg)
Do mikrokontrolera podpinam drabinke R2R (nie gotową tylko polutowaną z rezystorów), dokładnie tak jak przedstawia to rys.:
http://www.scienceprog.com/wp-content/uploads/2008i/DDS2/AVR_DDS_2_0_circuit.png (zamiast portu A jest B).
Za drabinką w miejsce DDS_OUT zamiast tego układu ze wzmacniaczami wrzucam rezystor podpięty do masy. I to na nim robie pomiary na oscyloskopie. Na wyjście portu wyrzucam poszczególne liczby z tabeli, wg. kodu znalezionego w necie (załącznik). Wszystko jest w porządku do pewnego momentu. Najpierw rośnie mi napięcie, a gdy dochodzi do wartości szczytowej i mam od początku wysyłać dane (kolejny przebieg sygnału) powstają jakieś krzaki. Później znów się stabilizuje i napięcie narasta, po czym znów są krzaki i tak w kółko (rysunek).
Code:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
const uint8_t trianglewave[] = //triangle wave
{
0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e
};
void static inline signalOUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)
{
asm volatile
(
"eor r18, r18 ;r18<-0" "\n\t"
"eor r19, r19 ;r19<-0" "\n\t"
"1:" "\n\t"
"add r18, %0 ;1 cycle" "\n\t"
"adc r19, %1 ;1 cycle" "\n\t"
"adc %A3, %2 ;1 cycle" "\n\t"
"lpm ;3 cycles" "\n\t"
"out %4, __tmp_reg__ ;1 cycle" "\n\t"
"rjmp 1b ;2 cycles. Total 9 cycles" "\n\t"
:
:"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(PORTB))
:"r18", "r19"
);
}
uint32_t temp;
uint8_t freq1, freq2, freq3;
int main()
{
DDRB = 0xFF;
PORTB = 0x00;
temp = 0x00BD;
freq1 = (uint8_t)(temp);
freq2 = (uint8_t)(temp >> 8);
freq3 = (uint8_t)(temp >> 16);
while(1)
{
signalOUT(trianglewave, freq3, freq2, freq1);
}
}
![[Attiny2313][C/AVR Studio] Problem z DDSem na Attiny2313 [Attiny2313][C/AVR Studio] Problem z DDSem na Attiny2313](https://obrazki.elektroda.pl/54_1279628879_thumb.png)