analoge to serial

algemene C code
Berichten: 42
Geregistreerd: 19 Mei 2016, 23:24

analoge to serial

Berichtdoor toku » 02 Jul 2018, 12:05

proteus.png
proteus.png (62.05 KiB) 7952 keer bekeken
hoi mensen.
met deze tutorial https://www.avrfreaks.net/forum/tut-c-n ... ic&t=56429,
probeer ik een analoge naar digital signal te krijgen en via de serial te sturen.
nu heb ik in proteus een circuit gemaakt (zie bijlage)
nu mijn vraag:
wat de ldr ook invoert ik krijg alleen ⸮ in de serial te zien. weet iemand wat hier miss gaat en hoe ik dit kan oplossen?

code is als volgt:
cpp code
#include <avr/io.h>
#include <util/delay.h>
#define BAUD 9600
#define BRC ((F_CPU/16/BAUD) -1)
#define F_CPU 16000000

char test;

void adc()
{
ADCSRA |= 0b00000111; // set Set ADC prescalar to 128 @ 16MHz
ADMUX |= 0b01000000; // set ref voltage
ADMUX |= 0b01100000; // set 10 bit to 8 bit with ADLAR
ADCSRB |= 0b00000000; // set free running mode
ADCSRA |= 0b10000111; // enable adc
ADCSRA |= 0b11000111; // start conversion
}
void TX()
{
UBRR0H = (BRC >> 8);
UBRR0L = BRC;
UCSR0B = (1 << TXEN0);
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);

}

int main(void)
{

DDRB = 0b00000011;
PORTB = 0b00000000;
while (1)
{
adc();
TX();
test = ADCH;
UDR0 = test;
_delay_ms(500);


if (ADCH < 128)
{
PORTB = 0b00000001;
_delay_ms(500);
}
else
{
PORTB = 0b00000010;
_delay_ms(500);
}

}
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: analoge to serial

Berichtdoor nicoverduin » 02 Jul 2018, 12:44

Geen idee wat je hier poogt te doen en ik snap eigenlijk niet waarom je het voor jezelf zo ingewikkeld heb gemaakt.
Dat je bagger lijkt te ontvangen komt vermoedelijk omdat je de een binaire waarde uit de ADC rechtstreeks stuurt naar de Serial. Met als gevolg dat per een zogenaamde
' unprintable character'. krijgt.
Je had ook het volgende kunnen doen:
cpp code
// Programma constantes
const uint8_t LED1 = 8;
const uint8_t LED2 = 9;

/**
* initialiseren van het programma
*/
void setup()
{
// initialiseren Serial
Serial.begin(9600);

// initialiseren IO
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
}
/**
* eindeloze loop
*/
void loop()
{
// lees de analoge waarde
uint16_t analogeWaarde = analogRead(A0);

// volgens oorspronkelijke code
delay(500);

// print deze over de Seriele monitor
Serial.println(analogeWaarde);

// test de waarde
if (analogeWaarde < 256) {
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
} else {
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
}

// volges de oorspronkelijke code
delay(500);
}

Dit is verder zonder enige efficiency what-so-ever.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 42
Geregistreerd: 19 Mei 2016, 23:24

Re: analoge to serial

Berichtdoor toku » 02 Jul 2018, 13:47

hey Nico,

bedankt voor je snelle reactie.

de bedoeling is om een output te krijgen van de ldr en deze via de serial(bluetooth/rf) naar een andere "arduino" te sturen

er zijn 2 redenen waarom ik het mezelf zo moeilijk maak.
1 als je altijd de makkelijkste weg kiest leer je niks
2 ik wil het programeren van microcontrollers leren niet alleen voor de arduino maar ook de andere avr en pic microcontrollers.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: analoge to serial

Berichtdoor nicoverduin » 02 Jul 2018, 14:07

Dan zou ik een routine bedenken om een binair getal om te zetten in decimale ascii tekens en die dan versturen naar de Serial.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 42
Geregistreerd: 19 Mei 2016, 23:24

Re: analoge to serial

Berichtdoor toku » 02 Jul 2018, 15:15

Hey Nico,

heb jij mischien een aantal tips waar ik kan zoeken?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: analoge to serial

Berichtdoor nicoverduin » 02 Jul 2018, 16:14

Je hebt een binaire waarde van bijv 345 hexadecimaal. Die moet je omzetten naar een decimaal getal. Omdat je geen gebruik wil maken van de arduino libraries, moet je dat zelf doen. Een ding weet je zeker is dat de waarde nooit groter dan 4 tekens is. Nl 1024. Je kan dus een loop maken die elke keer modulo 10 neemt. Bij die waarde tel je hex 30 op. Die waarde print je uit. Daarna deel je de waarde door 10 en herhaal alles. De loop duur maximaal 4 iteraties.
Je zult merken dat het resultaat precies verkeerd om staat. Je kan dus de waarden eerst in een 4byte array zetten en dan achterste voren uitlezen.
De uitwerking moet je zelf doen. Immers je wilde ervan leren
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: analoge to serial

Berichtdoor Koepel » 02 Jul 2018, 16:31

Tips waar je kunt zoeken ? Lees de datasheet een keer of 7 :lol: Maar toch ben ik serieus, als je bijvoorbeeld de vele PWM modes wilt begrijpen, dan is het misschien nodig om dat deel van de datasheet een aantal keren door te lezen.

Het programmeren van microcontrollers kan met de Arduino, het kan ook zonder de Arduino. Het ene is niet leerzamer dan het andere.

Alles staat online. Zoals bijvoorbeeld hoe de main() functie zit verscholen: https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/main.cpp.

Wanneer de Arduino werkt met je sketch, dan kun je alsnog zelf met de registers aan de slag. Timer0 is in gebruik voor millis() en Arduino zet nog een paar registers. Maar je kunt gerust zelf registers gaan schrijven en gebruiken.

Bij avrfreaks.net kun je veel informatie vinden. Heb je daar het onderdeel "Projects" al gezien ? Daar zitten leuke dingen tussen. Vaak kun je bibliotheken uit het "Projects" onderdeel combineren met Arduino. Dat heb ik wel eens gedaan omdat ik niet tevreden was met een standaard Arduino bibliotheek.

Kortom, mijn advies is om Arduino te gebruiken, en van daar uit bijvoorbeeld een PWM signaal te maken door naar registers te schrijven. Of gebruik de ADC met interrupts. Of maak zelf seriele communiatie.
Kijk eens naar de source code van ToneAC: https://bitbucket.org/teckel12/arduino-toneac/src. Dat is een Arduino functie, en het lijkt niet veel voor te stellen, maar om zo iets te maken is veel kennis van de microcontroller nodig.

Ik moest een paar maanden terug de datasheet er zelf nog bij pakken. Ik wilde Timer1 en Timer2 precies dezelfde frequentie laten maken ook al is de ene 8 bit en de andere 16 bit. Tsja, zo leer je de microcontroller vanzelf kennen.

De code die jij hebt is kort door de bocht. Dat vind ik niet leerzaam.

Berichten: 42
Geregistreerd: 19 Mei 2016, 23:24

Re: analoge to serial

Berichtdoor toku » 02 Jul 2018, 17:44

beide bedankt .

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: analoge to serial

Berichtdoor shooter » 02 Jul 2018, 19:47

begin eens met mblock ook een prima manier om te leren programmeren. en dan heb je wat sneller succes.
Gebruik alleen datgene wat je dan nodig hebt, want de evolutie van MCU gaat zo snel dat volgend jaar je kunt herbeginnen.
paul deelen
shooter@home.nl

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten