r-mik podał mi takie wskazówki jak zrobic kod,i abym poradziła się na innych forach jak to zrobić.
Na forach jakich byłam nikt nie potrafił zrobic kodu ,programu ,według wskazówek r-mik.
Czy ktoś tutaj wie jak zrobić taki kod według wskazówek r-mik.
Za pomoc z góry dziękuję.
Oto te wskazówki :
"Cały czas mowa o precyzyjnych częstotliwościach, współczynniku wypełnienia a uczepiłaś się najgorszego z możliwych rozwiązań mając sprzętowe sterowanie GPIO, gdzie trzeba liczyć każdy cykl maszynowy jak w latach 80.
W Generatorze DDS z EP 6/2018 jest sprzętowe sterowanie wyjściem:
void Timer1_Start(uint8_t dzielnik)
{
// OCR1B=dzielnik;
OCR1B=dzielnik;
//Output compare toggles OC1A pin
// TCCR1A |= 0x40; // COM1A = 1
TCCR1A |= 0x10; // COM1B = 1
//start timer without prescaler
TCCR1B = 0b00001001; // WGM 12=1, CS=1
DDRD |= _BV(PD4);
}
Uzyskasz DOKŁADNIE 50% bez liczenia cykli. Nie muszą być włączone przerwania ale mogą. Program główny może robić co chce a nie wpłynie to na generowany przebieg bez względu na to, czy przerwania będą włączone czy nie. Max częstotliwość to Fclk/2, uzyskaj taką przez delay. Taki program jest krótszy niż z delay. Jeśli częstotliwość jest zbyt duża należy timery połączyć w kaskadę.
Można także użyć timera w trybie PWM. Używając OCRxA można ustawić próg zliczania a co za tym idzie, precyzyjnie regulować częstotliwość.
Głupotą jest, mając możliwości sprzętowe, rozwiązywać problem w sposób programowy.
Uważasz, że nie mam racji? Napisz na innych forach i zweryfikuj moją wiedzę."
viewtopic.php?f=38&t=26188&start=80
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięJak zrobić kod według wskazówek r-mik
Moderatorzy:Jacek Bogusz, procesorowiec, r-mik, Moderatorzy
Re: Jak zrobić kod według wskazówek r-mik
Może chodzi o taki kod,tylko dlaczego jest napięcie 2.5 Volt ,dla mnie to nawet lepiej jak jest 2.5 Volt ,niż jak 4.5 Volt.
Jak zrobić aby przy kwarcu 16 MHz mieć te 64/64 sekund ,bo teraz maksymalnie jest 32/32 ,przy kwarcu 8MHz jest 64/64 sekund.
#include <avr/io.h> // Attiny 2313a , kwarc 8 MHz , około 64/64 sekundy ,2.5 Volt
main ()
{
DDRB = 255;
PORTB = 170;
DDRD = 255;
PORTD = 170;
TCCR1A |= (1 << COM1A0); // Uruchomienie kanału A Compare Output timera 1 w trybie negacji
TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler 1024
while(1)
{
PORTB ^= 255;
PORTD ^= 255;
}
}
// https://sites.google.com/site/qeewiki/b ... -atmega328
Aby było 4.75 Volt należy dać taki kod;
#include <avr/io.h> // Atmega 2313a , kwarc 8 MHz , około 64/64 sekundy , 4.75 Volt
main ()
{
DDRB = (1<<PB3)|(1<<PB4);
PORTB|=(1<<PB3);
TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler 1024
while(1)
if (TIFR & _BV(OCF1A)) {
TIFR = _BV(OCF1A);
{
PORTB ^= (1<<PB3)|(1<<PB4);
}
}
}
Jak zrobić aby przy kwarcu 16 MHz mieć te 64/64 sekund ,bo teraz maksymalnie jest 32/32 ,przy kwarcu 8MHz jest 64/64 sekund.
#include <avr/io.h> // Attiny 2313a , kwarc 8 MHz , około 64/64 sekundy ,2.5 Volt
main ()
{
DDRB = 255;
PORTB = 170;
DDRD = 255;
PORTD = 170;
TCCR1A |= (1 << COM1A0); // Uruchomienie kanału A Compare Output timera 1 w trybie negacji
TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler 1024
while(1)
{
PORTB ^= 255;
PORTD ^= 255;
}
}
// https://sites.google.com/site/qeewiki/b ... -atmega328
Aby było 4.75 Volt należy dać taki kod;
#include <avr/io.h> // Atmega 2313a , kwarc 8 MHz , około 64/64 sekundy , 4.75 Volt
main ()
{
DDRB = (1<<PB3)|(1<<PB4);
PORTB|=(1<<PB3);
TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler 1024
while(1)
if (TIFR & _BV(OCF1A)) {
TIFR = _BV(OCF1A);
{
PORTB ^= (1<<PB3)|(1<<PB4);
}
}
}
Ostatnio zmieniony 28 gru 2020, o 23:57 przez Ania30, łącznie zmieniany 11 razy.
Re: Jak zrobić kod według wskazówek r-mik
#include <avr/io.h> // Attiny 2313A ,16 MHz , 32/32 sekund
main()
{
DDRB = (1<<PB3)|(1<<PB4);
PORTB = (1 << PB3);
TCCR1B = | _BV(CS12) | _BV(CS10) ; // preskaler 1024
while(1)
if (TIFR & (1 << OCF1A)) {
TIFR |= (1 << OCF1A);
PORTB ^= (1<<PB3)|(1<<PB4);
}
}
main()
{
DDRB = (1<<PB3)|(1<<PB4);
PORTB = (1 << PB3);
TCCR1B = | _BV(CS12) | _BV(CS10) ; // preskaler 1024
while(1)
if (TIFR & (1 << OCF1A)) {
TIFR |= (1 << OCF1A);
PORTB ^= (1<<PB3)|(1<<PB4);
}
}
Ostatnio zmieniony 27 gru 2020, o 17:47 przez Ania30, łącznie zmieniany 1 raz.
Re: Jak zrobić kod według wskazówek r-mik
Czy ten kod jest lepszy od tego co zaproponował r-mik ?
#include <avr/io.h> // kwarc 16 MHz , 64/64 sekund ,fuse bit LOW 0xFF
main() {
TCCR1B = _BV(CS12) | _BV(CS10); // preskaler 1024
OCR1A = 15625;
DDRB = (1<<PB3)|(1<<PB4);
PORTB |= (1<<PB3);
uint8_t cnt = 0;
while(1) {
if (TIFR & _BV(OCF1A)) {
TIFR = _BV(OCF1A);
cnt++;
if (cnt == {
PORTB ^= (1<<PB3)|(1<<PB4);
cnt = 0;
}
}
}
}
#include <avr/io.h> // kwarc 16 MHz , 64/64 sekund ,fuse bit LOW 0xFF
main() {
TCCR1B = _BV(CS12) | _BV(CS10); // preskaler 1024
OCR1A = 15625;
DDRB = (1<<PB3)|(1<<PB4);
PORTB |= (1<<PB3);
uint8_t cnt = 0;
while(1) {
if (TIFR & _BV(OCF1A)) {
TIFR = _BV(OCF1A);
cnt++;
if (cnt == {
PORTB ^= (1<<PB3)|(1<<PB4);
cnt = 0;
}
}
}
}
Re: Jak zrobić kod według wskazówek r-mik
#include <avr/io.h> // Attiny 2313a , kwarc 2 MHz , 68/68 sekundy ,2.5 Volt
main ()
{
DDRB = 255;
PORTB = 170;
DDRD = 255;
PORTD = 170;
TCCR1A |= (1 << COM1A0); // Uruchomienie kanału A Compare Output timera 1 w trybie negacji
TCCR1B |= (1 << CS12) ; // Ustawienie preskalera na wartość 256
while(1)
{
PORTB ^= 255;
PORTD ^= 255;
}
}
-----------------------------------------------------------------------------------------------------------------
#include <avr/io.h> // Attiny 2313a , kwarc 2 MHz , 68/68 sekundy ,2.5 Volt
main ()
{
DDRB = (1<<PB3)|(1<<PB4);
PORTB|=(1<<PB3);
TCCR1A |= (1 << COM1A0); // Uruchomienie kanału A Compare Output timera 1 w trybie negacji
TCCR1B |= 4 ; // Ustawienie preskalera na wartość 256
while(1)
{
PORTB ^= (1<<PB3)|(1<<PB4); // Zmień stan diody LED
}
}
main ()
{
DDRB = 255;
PORTB = 170;
DDRD = 255;
PORTD = 170;
TCCR1A |= (1 << COM1A0); // Uruchomienie kanału A Compare Output timera 1 w trybie negacji
TCCR1B |= (1 << CS12) ; // Ustawienie preskalera na wartość 256
while(1)
{
PORTB ^= 255;
PORTD ^= 255;
}
}
-----------------------------------------------------------------------------------------------------------------
#include <avr/io.h> // Attiny 2313a , kwarc 2 MHz , 68/68 sekundy ,2.5 Volt
main ()
{
DDRB = (1<<PB3)|(1<<PB4);
PORTB|=(1<<PB3);
TCCR1A |= (1 << COM1A0); // Uruchomienie kanału A Compare Output timera 1 w trybie negacji
TCCR1B |= 4 ; // Ustawienie preskalera na wartość 256
while(1)
{
PORTB ^= (1<<PB3)|(1<<PB4); // Zmień stan diody LED
}
}
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 24 gości