Hoi,

Ik ben begonnen met arduino. Daar was ik erg blij met de serial monitor functie. In het begin gaf je aan dat je serial monitor ging gebruiken. En later kon je gewoon zeggen "serial.println(variabel); en steeds als dat werd uitgevoerd kwam dat netjes zichtbaar op mijn scherm.

Maar nu ik een tijd je avr's aan het programmeren ben in C. Met een avr dragon mis ik die functie. Hoe kan ik iets vergelijkbaars krijgen?

Ik had al wat gelezen dat je usart moet gebruiken met een max232. Maar hoe het precies zit weet ik niet.

Kan iemand mij hiermee helpen?

Groet,
Emiel

je moet een van TTL niveau naar rs232 niveau daar kan een max232 mee helpen deze zet de signalen om van de pc naar de AVr en andersom.

zie: http://open4u.nl/Elektronica/Embedded/RS232.htm

bij het aansluitblokje rechts sluit je de TX en RX van je AVR aan (zie datasheet)

[Bericht gewijzigd door Gerwin op (18%)]

Oké kan ik dan zoiets kopen?

Ik heb een M3N78-VM moederbord, heb ik dan wel zo'n poort?

Waar zie ik de data die ik verstuur? Hoe kan ik daar komen?

Hoe kan ik de data laten versturen door de avr?

Zoiets zou je inderdaad kunnen kopen. Maar omdat jouw moederbord geen seriele port heeft is een usb versie handiger. Bijvoorbeeld deze.

De rx port daarop verbind je direct aan de tx van je avr, en de tx op de rx. :)

Voor de werking van USART kan je het beste datasheet raadplegen, of bijvoorbeeld deze tutorial

Zien van informatie kan je met bijvoorbeeld Putty (wel instellen op serieel)

En als je slim bent koop je er gelijk 5 voor $14,25, Item number: 170741619720, ipv 1 voor 4,80

Met een dragon heb je iets veel beters dan telkens serial.print doen voor debugdoeleinden: Je kunt écht debuggen, met debugwire of via JTAG. Dat moet je avr wel hebben (attiny26 bijvoorbeeld heeft geen DW en geen JTAG, maar Atmega32 heeft ze allebij, en attiny's hebben vaak wel debugwire). Je kunt dan op elk moment in je code de uitvoering van de code stopzetten, ALLE variabelen bekijken (en zonodig veranderen), in ALLE registers neuzen (en zonodig wijzigen) etc.

Zo gauw je dat een keer gedaan hebt, debuggen met AVR dragon en debugwire vind je dat serial.print gebeuren gepruts. Voor communicatie met een computer O.K (eventueel via USB-serial omzetter of bluetooth of whatever), daar is het voor bedoeld. Maar om te debuggen werkt debugwire veel lekkerder.

Je sluit je AVR gewoon aan met de ISP connector, compiled je project, kiest voor debug, laat avr studio de fuses wijzigen om dwen aan te zetten (LET OP: je reset werkt dan niet meer, die lijn wordt gebruikt voor debugwire!. Maar na het debuggen kun je dwen weer uit laten zetten en werkt alles weer normaal. Tijdens het debuggen kun je gewoon reseten maar dan met een commando uit het menu en niet meer met de schakelaar op je resetlijn).

Vervolgens step je door je code (f10/f11). Of laat het runnen met f5 (stoppen met ctrl-f5), of runnen tot een breakpoint (breakpoint zetten met f9, runnen tot breakpoint met ctrl-F10 iirc, maar zit ook allemaal in de debug-menu).

Spelen met variabelen: Op var gaan staan, rechtermuisknop en add watch kiezen. Daarna kun je 'm bekijken en wijzigen. Registers staan in de register view aan de zijkant van het scherm en kun je ook bekijken en wijzigen.

Ben je klaar met debuggen dan kies je avr dragon options uit het menu en klik je op disable debugwire. (Als je van plan bent later opnieuw te gaan debuggen kun je het ook gewoon aan laten staan en gewoon voor stop debugging kiezen. B.v. om even wat te wijzigen in de code. Maar als je klaar bent met debuggen laat 'm dan debugwire weer disablen, want zolang debugwire aan staat kun je niet programmeren via ISP. Wel via debugwire trouwens: na een debug sessie staat de code die je debugde nog steeds in het geheugen en wordt ook gewoon uitgevoerd).

http://support.atmel.no/knowledgebase/avrstudiohelp/mergedProjects/AVR…

Asus mobo :)

Bedankt voor de reacties.

Ik ken het debuggen met debugwire en jtag, erg handig!

Maar ik wil de output van verschillende sensoren zien. En deze waardes eventueel kopiëren naar excel om er vervolgens een grafiekje van te maken.

Ik denk dat dit niet zo makkelijk kan met het debuggen, of wel?

Kan iemand mij a.u.b. nog even verder helpen?

De debug functie met debugwire of JTAG is niet geschikt denk ik, anders hoor ik het graag. Wil sensor waarden uitlezen laten we zeggen 2x per seconde. Deze informatie kopiëren en evt. in excel plakken om een grafiek te maken. Dit kon met arduino heel makkelijk.

Ik heb dus zo'n bordje nodig. Dan sluit ik de rx en tx lijn aan. Stuur mijn info d.m.v. uart erheen. En kan het dan uitlezen met Putty?

Is deze data kopieerbaar?

Ja dat kan. Als je het in putty hebt, kan je het volgens mij gewoon copieren. Maar ik heb geen verstand van windows.

Ik bedenk me net dat ik deze:

http://www.sparkfun.com/products/718

hier ook nog heb liggen. Er staat usb -> serial, maar dat kan ook wel andersom toch?

Of is dat niet te gebruiken hiervoor?

edit:
Ik dacht ik ga het gewoon proberen en krijg het volgende:

G1 Þ@ üøÞ`x~0`pàܶ¾@þÿÏw bÿ@tØæ¨ùÿþpÀÿxü¤üðõ `@þÀøÌóÀ
ü0ÿ0ðøüÀðÿààÀðøøðüÿüÿó!àÿþüþÿÿüøüÿÀþøüÿøøÿÿðÀøÿðøxþÀøÿÿøüÿþðàþðøþÿó`àððpþ ððøøÿ'cïøþùðü`øðÀøøÂÿPÿ
øÿÿþÁÿÿø~üððÿððÿøþÿÿÿÿþüüÿøÿóüÀxþøüøÿ`Àÿ@Àøþ}àþðüþøþþÿÿüóÀøüÿøðøøøÿÿøfüøúþøð¤ÿøÿÿýÿþÿñ@øü þøàø

Waarschijnlijk heeft het iets te maken met het versturen als string maar interpreteren als integer of andersom.



// Zender
#define F_CPU 16000000UL

#include <avr/io.h>

//  Wait until tx holding register is empty, then send character c down the UART Tx.
#define uart_sendchar(x) loop_until_bit_is_set(UCSR0A, UDRE0);\
    UDR0 = x


void uart_init(void)
{
    UCSR0A = 0x00;
    UCSR0B = _BV(TXEN0);                     		// enable tx
    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);             // 8N1
    UBRR0H = 0;
    UBRR0L = (unsigned char) ((F_CPU / (16UL * 16000000UL)) - 1);  // set baudrate - 38400bd
}


int main(void)
{
    unsigned char input;

    uart_init();

    while(1) 
	{
			input = 55;
			uart_sendchar(input);					// Verstuuren

		
    }
}

[Bericht gewijzigd door Emielzij op (75%)]

Je baudrate staat verkeerd. Dwz. in de AVr staat iets anders dan dat je in putty hebt ingesteld.
55 is een "7" dus als je hem goed hebt staan zal er iets als 7777777777777777777 verschijnen.

[update]
Volgens mij heb je iets verkeerd zitten editen in de baud rate berekening. Volgens mij probeer je de baudrate op 1 baud te zetten (en dat kan dan weer niet waardoor je een veel hogere baudrate krijgt).

[Bericht gewijzigd door rew op (36%)]

Hoezo komt er dan een 7?
En welke baudrate kan ik dan beter gebruiken? / hoe kan ik het aanpassen? Heb je misschien een voorbeeld programma hoe jij data verstuurd?

Baudrate instelling:


    UBRR0 = (unsigned char) ((F_CPU / (16UL * 38400L)) - 1);  // set baudrate - 38400bd

Maar voor welk type avr wil je dit gaan gebruiken (staat misschien ergens maar kon het zo snel niet vinden)

Op 18 december 2011 17:20:58 schreef Emielzij:
Hoezo komt er dan een 7?

Omdat code (waarde) 55 overeenkomt met ascii '7'.
Zoek eens een ascii tabel op en kijk welke waarde overeenkomt met een bepaald karakter. Als je dit karakter op je pC wilt zien zal je de waarde/code van dat karakter moeten versturen.

[Bericht gewijzigd door driessens_nl op (44%)]

Ik gebruik een atmega324.
Het werkt nog niet.

Hoe kan ik ervoor zorgen dat als ik 55 verstuur dat ik ook echt 55 zie?

KAn kloppen dat het niet werkt, door in UCSR0A 0 te schrijven klopt de uart klokdivider niet -> is nu 8 geworden.
Dus wordt de formule:
[code]
UBRR0 = (F_CPU / (8UL * 38400L)) - 1; // set baudrate - 38400bd
[/code]
EDIT: fout bit U2Xo=0 is delen door 16 ! Maar aangezien het nu nog steeds niet werkt moet er nog wat fout zijn. Zijn Tx en Rx niet gewisseld ? Draait de uProc ook wel op 16Mhz ? staat toevallig de CKDIV8 niet aan ?

Als je 55 wilt zien op je PC zal je dus twee karakters moeten versturen
nl. '5' en '5' (2x code 0x35).
ER bestaan ook functies in C die dit soort omzetting voor je doe bijv. itoa.
Alleen zal je dan een string moeten versturen en gezien de moeilijkheden die je nu al hebt zo ik me eerst focussen op iets zinnigs naar de PC te versturen.

EDIT: zag ook net dat in mijn vorige antwoord vergeten ben de (unsigned char) conversie weg te halen. Nu zal dit met deze hogere baudrates geen problemen opleveren maar kan wel degelijk een probleem worden bij lagere baudrates

EDIT2: het is in GCC waarschijnlijk ook mogelijk gebruik te maken van de library functie printf als je zelf een uart_putchar functie maakt.
Voor meer uitleg zie mikrocontroller.net

Op 18 december 2011 11:53:20 schreef Emielzij:
Kan iemand mij a.u.b. nog even verder helpen?

De debug functie met debugwire of JTAG is niet geschikt denk ik, anders hoor ik het graag. Wil sensor waarden uitlezen laten we zeggen 2x per seconde. Deze informatie kopiëren en evt. in excel plakken om een grafiek te maken. Dit kon met arduino heel makkelijk.

Ik heb dus zo'n bordje nodig. Dan sluit ik de rx en tx lijn aan. Stuur mijn info d.m.v. uart erheen. En kan het dan uitlezen met Putty?

Is deze data kopieerbaar?

Ja, dan heb je idd een gewone seriële verbinding nodig. Om de een of andere vage reden dacht ik dat je wilde debuggen...

Data is AFAIK gewoon kopierbaar, maar ik gebruik gtkterm... ;)

Verbinding testen: hang aan de microcontrollerkant van je max232 bordje (of USB-serial) de tx en rx aan elkaar en zend iets vanuit de PC. Dan moet je dat op de PC terugzien, en als je de verbinding verbreekt juist niet terugzien. (of dubbel resp. enkel terugzien, als local echo aanstaat in die terminalsoftware). Dan weet je dat iig je converter goed werkt.

hier kun je ook veel info vinden, en ook voorbeeldprogrammatjes met seriële communicatie.

    UBRR0L = (unsigned char) ((F_CPU / (16UL * 16000000UL)) - 1);  // set baudrate - 38400bd

Da's wel een flinke blunder van ondergetekende (sorry, Emiel).
Maar als je twee AVR's op die manier initialiseert, werkt het zondermeer. Er komt 254 in UBRR0L te staan, zodat de baudrate haast 2000bd bedraagt.