mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik programm mit externem tool auf atmega schrieben


Autor: Jan flember (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
bevor ich hier wild drauflos schreibe möchte ich vorneweg sagen was mein 
ziel ist:
ich möchte nämlich 2 verschiedene programme zu einem beliebigen 
zeitpunkt auf den atmega schreiben ohne jedesmal sisyavr öffnen zu 
müssen.
bsp:
das eine versetzt das myavrboard in den "standby - modus" und das andere 
programm lässt zum beispiel eine LED leuchten.
mein ziel ist, das board ,auf kurzem wege, über den pc zu steuern:
das heißt um 3 uhr soll die LED auflecuhten für 2 min und den rest des 
tages soll das gerät im standbymodus bleiben.
mit hilfe anderer programmiersprachen wäre das theoretisch kein problem. 
da man aber ein usb gerät im windows nicht einfach so aktivieren und 
deaktivieren kann,und ich mich mit TWI überhaupt nicht auskenne, suche 
ich seit einer woche nach einer möglichkeit, den atmega mit einem 
anderen programm zu brennen. also wenn ich auf "kompilieren" drücke, 
wird ja der quelltext in die sprache des atmega übersetzt und dies wird 
in einer datei gespeichert.
also im besten falle möchte ich das fertige programm per doppelklick( 
auf eine exe) auf den atmega schreiben.
gibt es so etwas? und wenn nicht, würd ich gerne wissen wie das sisyavr 
macht, um mir dann soetwas selber programmieren zu können.
ich bedanke mich für jede hilfe im voraus.
gruß

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan flember wrote:
> das heißt um 3 uhr soll die LED auflecuhten für 2 min und den rest des
> tages soll das gerät im standbymodus bleiben.

Und warum soll das der PC machen?

Du schreibst für den AVR ein Programm, welches um 3.00 die LED an und um 
3.02 aus schaltet.


Peter

Autor: Jan flember (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das war nur ein beispiel. im prinzip geht es darum, ein usb gerät, in 
dem fall das mk2 board zu steuern.
ich habe gehört das das auch anders geht:

"Die bessere Lösung ist, beide Programmteile auf den ATmega8 zu bringen 
und nur ein Kommando vom PC zu senden um die eine oder andere Funktion 
auszulösen.
Dies ist auch sehr einfach möglich, da der mySmartUSB (auch auf myAVR 
Board MK2/MK3 ) auch einen Datenmodus besitzt und so die UART des 
ATmega8 mit einem virtuellen COM-Port im PC verbindet. So kannst du z.B. 
vom PC ein "S" senden und der ATmega geht in Standby und ein "L" senden 
um die LED anzuschalten."

nur weiß ich nicht wie das geht. hat jemand eine ahnung oder einen 
ansatz bzw code?

gruß

Autor: Justus Skorps (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das hat aber absolut nichts mit dem zu tun, was du im ersten Posting 
beschrieben hast...
das ist ein einziges Programm, welches auf einen Interrupt vom UART 
wartet und je nach empfangenen Zeichen eine andere Funktion 
aufruft...und sowas dürfte sich sich in jedem µC-Tutorial finden...

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>da man aber ein usb gerät im windows nicht einfach so aktivieren und
>deaktivieren kann,und ich mich mit TWI überhaupt nicht auskenne, suche
>ich seit einer woche nach einer möglichkeit, den atmega mit einem
>anderen programm zu brennen.

Man kann sich auch von hinten durchs Auge in die Brust schiessen...
Wenn du die Aufgaben (die der Controller erfüllen soll) verständlich 
formulierst, dann wird dir auch geholfen.
Niemand programmiert einen Controller alle 2 Minuten um (nein, ich habe 
den obigen Text schon verstanden...).

Autor: Jan flember (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da ich mich mit echtzeituhren nicht auskenne, versuche ich z.B. einen 
Wecker zu programmieren, wobei der PC sozusagen die Uhr ist und dem 
Board den Impuls zum "piepen" oder "leuchten" gibt.

wäre die uhr im board intergiert, wäre das ca so:
if uhrzeit == 7:30
{

LED lecuhtet

else

nix

}

wie gesagt: der pc soll über die eingabeaufforderung dem board 
sagen:"leuchte" :)

gruß

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan flember wrote:
> da ich mich mit echtzeituhren nicht auskenne, versuche ich z.B. einen
> Wecker zu programmieren, wobei der PC sozusagen die Uhr ist und dem
> Board den Impuls zum "piepen" oder "leuchten" gibt.
>
> wäre die uhr im board intergiert, wäre das ca so:
> if uhrzeit == 7:30
> {
>
> LED lecuhtet
>
> else
>
> nix
>
> }
>
> wie gesagt: der pc soll über die eingabeaufforderung dem board
> sagen:"leuchte" :)
>
> gruß

also nochmal:

- Interrupt-Routine für RXD, in der das angekommene Zeichen gelesen 
wird, und ein Flagg gesetzt wird

- in der Endlosschleife wird auf das Flagg geprüft und das Zeichen dann 
ausgewertet und zB die LED angeschaltet...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Justus Skorps wrote:

> also nochmal:
>
> - Interrupt-Routine für RXD, in der das angekommene Zeichen gelesen
> wird, und ein Flagg gesetzt wird
>
> - in der Endlosschleife wird auf das Flagg geprüft und das Zeichen dann
> ausgewertet und zB die LED angeschaltet...

Das ist zwar prinzipiell die bessere Lösung, allerdings sollte der TO 
bei seinem Vorwissen erst mal die konventionelle Lösung machen. Bis du 
ihm ausgedeutscht hast, was Interrupts sind ....


@Jan
Du brauchst also 2 Programme
Eines welches am PC läuft und die Zeit abfragt.
Als Kommando schickt das Programm über die USB/UART zb ein 'L', wenn die 
Lampen eingeschaltet werden sollen, ein 'P' wenn piepsen anbesagt ist 
und ein 'Q' wenn alles wieder ausgeschaltet werden soll.

Am µC läuft dann ein Program, welches im Grunde nichts anderes macht als
   while( 1 ) {         // ewig abarbeiten

     warte auf Zeichen vom UART

     if( Zeichen == 'L' )
        schalte Lampe ein

     if( Zeichen == 'P' )
        schatle Piepser ein

     if( Zeichen == 'Q' )
        schalte Lampe und Piepser aus

   }

Dir ist hoffentlich aber klar, dass das was du da machst, ziemlicher 
Nonsense ist. Dein AtMega ist ein kleiner Computer. Für den ist es ein 
leichtes selbst Buch über die Zeit zu führen und entspechend zu 
schalten. Extra dafür einen PC mitlaufen zu lassen, nur damit sich der 
um die Zeit kümmert ist ein klein wenig übers Ziel hinausgeschossen. 
Sinn der Sache ist es immer, das dein Mega autonom arbeitet, ohne auf 
die Hilfe eines PC angewiesen zu sein.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan flember wrote:
> wäre die uhr im board intergiert, wäre das ca so:

Eine Uhr in den MC zu programmieren ist eine typische Einsteigeraufgabe.
Mach es, Du lernst dabei viele Grundlagen, welche fürs MC-Programmieren 
nötig sind.

Als Zeitbasis nimmt man einen Timer, der den CPU-Takt (Quarz!) zählt
Oft wird auch ein DCF77-Dekoder programmiert, um die Uhr automatisch zu 
stellen.


Peter

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
>
> Das ist zwar prinzipiell die bessere Lösung, allerdings sollte der TO
> bei seinem Vorwissen erst mal die konventionelle Lösung machen. Bis du
> ihm ausgedeutscht hast, was Interrupts sind ....
>

schon klar, aber wenn man das Zeug eh erst lernen muss, dann sollte man 
es doch gleich richtig machen...und schliesslich ist es hier im Tutorial 
auch gut erklaert...

Autor: Jan flember (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie der pc ein 'L' schickt ist mir klar. was der prozessor macht ist mir 
auch klar. es geht mir eigentlich nur noch um das "zeichen".
wie, bzw mit welchem befehl/code, empfängt der controller das signal vom 
pc.

"
Code:
uart.config(9600,UDR);

und in der mainloop:
Code:
uint8_t cmd=uart.getChar();
if(cmd=='S')
  {....dein standby-code...}
else if(cmd=='L')
  {....dein led-code...}


Eingabeaufforderung in etwa so:
Code:
>mode com1: 9600,n,8,1
>echo S>>com1
"

nur stimmt beim ersten code iwas nicht.
wäre toll wenn ihr mir dabei noch helfen könntet.
letztendlich werde ich wahrscheinlich sowieso das ganze was ihr 
beschreibt lernen müssen^^
gruß

Autor: Jan flember (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich fuchtel grad ewig rum doch iwie will mir das nicht gelingen bei dem 
Code:
uart.config(9600,UDR);
kommt:

cc:20: error: expected constructor, destructor, or type conversion 
before '.' token

und deshalb ist 'uart' natürlich nicht deklariert.

kennt jemand den fehler?
danke

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig erkenne, benutzt du C++ anstelle von C. Anders kann 
ich mir die Punkte nicht erklären. Benutzt du eine vordeffinierte klasse 
oder was ist das?

Poste bitte mal das komplette Programm und ich würde dir wenn es C++ ist 
empfehlen auf reines C zu wechseln.

Gruß ErgoProxy

Autor: Jan Flember (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum einen habe ich einen asm code und dann noch den c++ code, allerdings 
fehlt mir da die programmvorlage für UART:


asm code:

; Start, Power ON, Reset
main: ldi r16, hi8(RAMEND)
out SPH, r16
ldi r16, lo8(RAMEND) ; Stack Initialisierung
out SPL, r16 ; Init Stackpointer
sbi UCSRB, 3 ; USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren
ldi r16, 3686400/(9600*16)-1 ;Baudrate 9600 einstellen
out UBRRL, r16
mainloop: ldi r16, 'T'
rcall putChar
ldi r16, 'e'
rcall putChar
ldi r16, 's'
rcall putChar
ldi r16, 't'
rcall putChar
ldi r16, '!'
rcall putChar
ldi r16, 10
rcall putChar
ldi r16, 13
rcall putChar
ldi r16, 4
rcall putChar
rcall wait
rjmp mainloop
;----------------------------------------------------------------------- 
-------
putChar: sbis UCSRA, 5 ; USR=UCSRA=0x0B UDRE=Bit5
rjmp putChar ; warten, bis UDR bereit
out UDR, r16
ret ; zurück zum Hauptprogramm
;----------------------------------------------------------------------- 
-------
wait: push r24
push r25
ldi r25, 0x02
loop1: ldi r24, 0xFF
loop2: subi r24, 0x01
brcc loop2
subi r25, 0x01
brcc loop1
pop r25
pop r24
ret
;----------------------------------------------------------------------- 
--------



c++code:

uart.config(9600,UDR);

uint8_t cmd=uart.getChar();
if(cmd=='S')
{....dein standby-code...}
else if(cmd=='L')
{....dein led-code...}

Autor: Jan Flember (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADD: ich benutze sisy avr
gruß

Autor: Jan flember (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und?
Willst du das jetzt irgendwie mischen, oder was?

Wenn ich nach Sisy AVR google, dann kommt da immer, das da ein 
C-Compiler mit im Paket ist. Von C++ ist da nirgends die Rede.

Ich werd das Gefühl nicht los, das du grade versuchst den 10-ten Schritt 
vor dem ersten zu machen.

Und das was du da als C++ Code präsentierst, ist noch nicht mal 
ansatzweise kompletter C++ Code.

Vielleicht wird irgendjemand anderer aus dem Code-Fetzen, die du da von 
dir gibst, schlau. Ich werd es auf jeden Fall nicht.


Edit: Hab inzwischen einen Link gefunden, nachdem C++ tatsächlich 
unterstützt wird.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.