Forum: Mikrocontroller und Digitale Elektronik Hilfe beim umschreiben in C


von Peter L. (imax2010)


Lesenswert?

Hallo, möchte das flightlight von dieser seite 
(http://der-frickler.net/modellbau/avr/flightlight) nachbauen. Hab das 
problem dass auf der homepage ein mega8 verwendet wurde und ich im 
moment nur einen mega8535 habe. Mir wurde gesagt dass ich den Quellcode 
umschreiben müsste da ich aber in C nicht so gewandt bin wollte ich 
fragen ob mir dabei jemand helfen könnte.

Mfg
Peter

P.S. Datei könnt ihr auf der oben genannten Website herunterladen

von Frank B. (f-baer)


Lesenswert?

Du meinst, du suchst jemanden, der es für dich macht?

Kleiner Tipp: Hol dir einen Mega8. Du wirst hier wohl kaum jemanden 
finden, der das für dich macht.
Wenn du aber konkrete Fragen zur Anpassung einzelner Codesegmente hast, 
dann wird dir sicherlich jemand helfen.

von Tip (Gast)


Lesenswert?

Peter L. schrieb:
> Mir wurde gesagt dass ich den Quellcode
> umschreiben müsste da ich aber in C nicht so gewandt bin wollte ich
> fragen ob mir dabei jemand helfen könnte.

Mit C Kenntnissen hat das wenig zu tun. Ohne den mega8535 näher zu 
kennen, vermut ich, dass du nur ein paar Registerbezeichnungen anpassen 
mußt. Aber warum so einen "riesen" Prozessor, wenn alles für eine mega8 
fertig ist?

von Matthias (Gast)


Lesenswert?

Was gibt es denn für Probleme, wenn du das Programm für einen ATmega8535 
kompilierst?

von Christian H. (christian_h)


Lesenswert?

Wenn du C nicht kannst, dann lerne es bitte. Ist immer nützlich.
Niemand wird für dich das ganze "umschreiben", wenn das überhaupt soo 
viel sein sollte.  Aber viel besser wäre doch noch, wenn du dir deinen 
eigenen Code schreiben würdest, weil man mehr lernt und es mehr Spaß 
macht.

von Peter L. (imax2010)


Lesenswert?

Tip schrieb:
> Aber warum so einen "riesen" Prozessor, wenn alles für eine mega8
> fertig ist?

Hab im moment keinen anderen und bei uns in Südtirol gibt es leider nur 
einen Elektronikladen der nur einen pic führ sowie ein paar andere 
kleinigkeiten und ich nicht extra einen bestellen möchte da der 
mindestbestellwert nicht gerade niedrig ist.

Tip schrieb:
> ein paar Registerbezeichnungen anpassen
> mußt

Gibt es da irgendwo seiten wo steht wo welche register verwendet werden? 
Eigentlich hab ich auch nur da das problem da ich nicht weiß welches 
register ich ändern müsste. Wenn mir da jemand tipps geben könnte wäre 
ich schon glücklich


Mfg
Peter

von Guru (Gast)


Lesenswert?

>Wenn mir da jemand tipps geben könnte wäre ich schon glücklich

Mit "Tips" ist Dir da, meiner Ansicht nach, nicht weitergeholfen.
Du müsstest erstmal grundlegend die beiden Prozessoren verstehen, was 
aber nicht ganz so umfangreich ist, weil die beiden sich sehr ähneln.
Wenn Du mit denen noch garnichts zu tun hattest oder auch garkeine 
Ahnung von C hast, musst Du das erstmal lernen.

Dann musst Du gucken, welche Register in dem ursprünglichen Programm 
verwendet werden und wozu. Dann die gleiche Peripherieeinheit im 
Zielprozessor nachlesen und gucken, welches Bit in welchem Register die 
äquivalente Funktion erfüllt.

Tut mir leid: Es gibt keine Abkürzung.

von Alexander S. (esko) Benutzerseite


Lesenswert?

Peter L. schrieb:
> Hab im moment keinen anderen [...] ich nicht extra einen bestellen
> möchte da der mindestbestellwert nicht gerade niedrig ist.

Suche dir hier einen Versender aus, der günstig nach AT verschickt.
Elektronikversender

von Rainer (Gast)


Lesenswert?

Was hast du denn außer dem Prozessor:
 - Programmieradapter ( )
 - Brennprogramm      ( )
 - C-Compiler         ( )

Hast du das Programm schon für den ATmega8 kompiliert?
Hast du versucht, das Programm für den ATmega8535 zu kompilieren?
Kommen da Warnungen/Fehlermeldungen (welche)?

Sag, wo es genau hakt, dann kann dir geholfen werden.
Vermutlich sind die Prozessoren sogar ähnlich genug, dass man da gar 
nichts ändern muß.

von Helmut (Gast)


Lesenswert?

Es gibt schon eine Abkürzung. Einfach mal versuchen das Programm in den 
85835 zu schreiben. PB4 dürfte beim 8535 auch PB4 sein.
Wenn der Quellcode vorhanden ist, dann mal versuchen das Programm neu zu 
kompilieren mit Angabe des neuen Prozessors.

Anhand der Fehlerliste vom Kompiler wird man erkennen können, was der 
Kompiler nicht verstanden hat.

Ansonsten sind die Tipps hier im Forum in gewissem Sinne Unsinn.
Niemand muss z.B. Jura studieren, nur weil jemand einen Paragrafen 
hinterfragt.

von Peter L. (imax2010)


Lesenswert?

Alexander Schmidt schrieb:
> Suche dir hier einen Versender aus, der günstig nach AT verschickt.

Wenn du mit AT Österreich meinst dann bist du nicht ganz auf dem 
neuesten Stand: Südirol gehört seit einigen Jahren (seit 1918) zu 
Italien (leider).

Sind diese Versandhäußer auch verlässlich? Hab da schon einiges an 
erfahrung gesammelt.

Rainer schrieb:
> Was hast du denn außer dem Prozessor:
>  - Programmieradapter ( )
>  - Brennprogramm      ( )
>  - C-Compiler         ( )
>
> Hast du das Programm schon für den ATmega8 kompiliert?
> Hast du versucht, das Programm für den ATmega8535 zu kompilieren?
> Kommen da Warnungen/Fehlermeldungen (welche)?
>
> Sag, wo es genau hakt, dann kann dir geholfen werden.
> Vermutlich sind die Prozessoren sogar ähnlich genug, dass man da gar
> nichts ändern muß.


Zum Programmieren nutzte ich den LPT port. Zum Brenner benutzte ich 
AvrDude
da das AVR-Studio den parallelprogrammer nicht unterstützt.
Als C-Compiler benutze ich WinAvr

Probier nochmal das programm zu kompilieren kann mich aber erinnern dass 
2 o. 3  fehlermeldungen erschienen sind. (Melde mich gleich mit dem 
ergebnis)

Das programm hab ich auch mal direkt geflasht (das mega8) und an den 
richtigen pins des mega8535 angesteckt leider ohne funktion


Mfg
Peter

von Peter L. (imax2010)


Angehängte Dateien:

Lesenswert?

Wenn ich auf Build klicke dann kommt nur eine Warnung (siehe bild)
Klicke ich auf Compile dann sagt er succeed with 0 Warnings

mfg
Peter

von Daniel B. (dbuergin)


Angehängte Dateien:

Lesenswert?

Nach ersetzen von TIM1_OVF_vect mit TIMER1_OVF_vect lässt es sich auf
jeden Fall kompilieren:
1
:>make all
2
3
-------- begin --------
4
avr-gcc (GCC) 4.3.3
5
Copyright (C) 2008 Free Software Foundation, Inc.
6
This is free software; see the source for copying conditions.  There is NO
7
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8
9
10
Compiling: flightlight_mega8.c
11
avr-gcc -c -mmcu=atmega8535 -I. -gstabs   -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=flightlight_mega8.lst  -std=gnu99 -Wp,-M,-MP,-MT,flightlight_mega8.o,-MF,.dep/flightlight_mega8.o.d flightlight_mega8.c -o flightlight_mega8.o 
12
13
Linking: flightlight_mega8.elf
14
avr-gcc -mmcu=atmega8535 -I. -gstabs   -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=flightlight_mega8.o  -std=gnu99 -Wp,-M,-MP,-MT,flightlight_mega8.o,-MF,.dep/flightlight_mega8.elf.d flightlight_mega8.o   --output flightlight_mega8.elf -Wl,-Map=flightlight_mega8.map,--cref    -lm
15
16
Creating load file for Flash: flightlight_mega8.hex
17
avr-objcopy -O ihex -R .eeprom flightlight_mega8.elf flightlight_mega8.hex
18
19
Creating load file for EEPROM: flightlight_mega8.eep
20
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
21
  --change-section-lma .eeprom=0 -O ihex flightlight_mega8.elf flightlight_mega8.eep
22
avr-objcopy: --change-section-lma .eeprom=0x00000000 never used
23
24
Creating Extended Listing: flightlight_mega8.lss
25
avr-objdump -h -S flightlight_mega8.elf > flightlight_mega8.lss
26
27
Creating Symbol Table: flightlight_mega8.sym
28
avr-nm -n flightlight_mega8.elf > flightlight_mega8.sym
29
30
Size after:
31
flightlight_mega8.elf  :
32
section    size      addr
33
.text       306         0
34
.bss          2   8388704
35
.stab      1260         0
36
.stabstr   1742         0
37
Total      3310
38
39
40
41
Errors: none
42
-------- end --------

von Rainer (Gast)


Lesenswert?

Das hört sich doch schon vielversprechend an.

Ändere TIM1_OVF_vect in TIMER1_OVF_vect wie von Daniel vorgeschlagen 
(das meint das selbe). Beim WinAVR muß es TIMER1_OVF_vect heißen (auch 
beim ATmega8).

Dann sollte das auch bei dir ohne Fehler und Warnungen durch den 
Compiler gehen. Mit dem Hex-File müßte es dann besser funktionieren.

von Peter L. (imax2010)


Lesenswert?

Bei mir kommt mit der änderung auch keine fehlermeldung mehr. ich flash 
mal gleich den controller und dann mal schauen

Mfg
Peter

von Peter L. (imax2010)


Lesenswert?

Habs jetzt probiert aber funktioniert immer noch nicht (fehlt doch mehr)

Mfg
Peter

von Rainer (Gast)


Lesenswert?

Hast du ein Servo-Steuersignal an PD.2 anliegen?

von Rainer (Gast)


Lesenswert?

Betreibst du deinen Prozessor mit dem richtigen Quarztakt? Das Programm 
ist anscheinend fest für einen 1 MHz-Takt geschrieben. Für andere 
Prozessorgeschwindigkeiten müssen im Programm die Zeitkonstanten für die 
Umschaltung zwischen den Befeuerungsarten angepaßt werden.

Gruß
Rainer

von Rainer (Gast)


Lesenswert?

Damit das Programm richtig funktioniert, muß entweder die 
Compileroptimierung ausgeschaltet werden oder die Variable "value" muß 
als volatile deklariert werden, damit die Kommunikation zwischen ISR und 
Hauptprogramm funktioniert, also

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint16_t value;

ISR (TIMER1_OVF_vect)
...

von Peter L. (imax2010)


Lesenswert?

Rainer schrieb:
> Hast du ein Servo-Steuersignal an PD.2 anliegen?

Hab da das Signal von meinem Empfänger anliegen (bei Atmega8535 ist 
Int0/PD2 pin16 und beim mega8 pin4 aber das dürfte doch egal sein oder?)

Rainer schrieb:
> Betreibst du deinen Prozessor mit dem richtigen Quarztakt? Das Programm
> ist anscheinend fest für einen 1 MHz-Takt geschrieben

Hab nichts geändert der Controller arbeitet mit keinem externen Quarz.
Hab immer die "Grundeinstellung" genutzt

Rainer schrieb:
> Damit das Programm richtig funktioniert, muß entweder die
> Compileroptimierung ausgeschaltet werden oder die Variable "value" muß
> als volatile deklariert werden

Probiere das mal gleich und gebe bescheid obs funktioniert oder nicht!


Mfg
Peter

von Peter L. (imax2010)


Lesenswert?

Hab das Programm jetzt geflasht und es funktioniert (so halb). Es 
leuchten die LEDs sobald ich das signal anstecke jedoch kann ich es 
nicht steuern (hab an meiner graupner mx-12 nur einen 2 
Stufenkippschalter habs aber mit dem Gasknüppel probiert).
Möchte mich mal bei denjenigen bedanken die mir geholfen haben und mich 
somit ein stückchen weiter Richtung Ziel gebracht haben.

Mfg
Peter

von Peter L. (imax2010)


Lesenswert?

So, habe mich entschlossen jetzt doch meinen eigenen Code zu machen.
Da ich aber auf meine graupner mx-12 keinen 3-Stufen Schalter habe 
möchte ich es so machen (hab einen Taster bei der Mx-12), dass wenn ich 
den Knopf einmal drücke sollen die Positionslichter angehen, drücke ich 
ein zweites mal dann sollen die Blitzer einschalten (positionslichter 
bleiben an) drücke ich ein drittes mal so sollen die Landesheinwerfer 
einschalten und wenn ich ein 4. mal drücke dann sollen alle Lichter 
ausschalten.

Kann mir vlt. jemand erklären wie das mit dem Timer realisierbar 
wäre(oder sogar einfacher)?

(so wie der Code im moment war hab ich ihn ja schon so halbwegs 
verstanden aber wie soll ich das machen dass er nur dann zählt wenn ich 
einen Taster drücke? Kann man dem Controller einfach sagen ,dass wenn 
ein High am signal ist soll er eine Aktion ausführen und wenn dann 
nochmal gedrückt wird (noch ein High) dann zählt er eines dazu und führt 
die nächste aktion aus)


Mfg
Peter

von Rainer (Gast)


Lesenswert?

Der Timer mißt nur die Länge des Steuerimpulses aus und legt den Wert in 
"value" ab. Für eine Tastfunktion müstest du z.B. jedesmal, wenn sich 
die gemessene Impulsdauer von "lang" auf "kurz" ändert, eine Variable 
erhöhen (und beim Erreichen von 4 direkt auf 0 zurücksetzen). Damit 
kannst du dann die LED-Ausgänge steuern.

Aber kannst du nicht den Flaps-Kanal auf Proportionalbetrieb umstellen 
und damit die Befeuerung steuern? Oder geht der immer gleich wieder in 
die Ruhestellung wenn man die Wippe los läßt (ich kenne die MX-12 
nicht)?

Gruß
Rainer

von Peter L. (imax2010)


Lesenswert?

@Rainer

so hab ich das auch gemeint, dass immer wenn man den Taster drückt zählt 
er eines dazu und beim vierten springt er wieder auf 0.

Auf der Mx-12 gibt es zwei Trimmer mit flaps funktion.(gleiche trimmer 
wie für die Ruder regelung) Würde das schon probieren hab aber keine 
idee welcher kanal das ist(beim empfänger).
Hab bei meinem kleinen modell (Cessna, elektro) an dem ich gerade das 
probiere nur einen 4 Kanal empfänger aber an meinem anderen Modell 
(Edge540)
hab ich einen 8-Kanal Empfänger.


Mfg
Peter

von Rainer (Gast)


Lesenswert?

Häng doch einfach mal einen Servo der Reihe nach an alle Empfängerkanäle 
ran. Der sollte auf die Flaps-Einstellung reagieren.

von Peter L. (imax2010)


Lesenswert?

werde es sobald meine fernsteuerung wieder geladen ist testen.

Mfg
Peter

von Peter L. (imax2010)


Lesenswert?

Ja  mit der Flapseinstellung kann ich den Servo steuern. Außerdem 
funktioniert es auch mit den Lichtern die aber nur leuchten d.h. nicht 
blinken. hab beim Versuchsaufbau für jede der 3 verschiedenen Arten 
(positionslicht,blitzer,landescheinwerfer) eine Led drangehängt die aber 
je nach in wlcher stellung der Trimmer ist, gar nicht lauchten (trimmer 
ganz unten), eine led leuchtet (trimmer mitte), oder beide leuchten 
(trimmer oben)

Da fehlts doch dem Programm oder?

Mfg
Peter

von Rainer (Gast)


Angehängte Dateien:

Lesenswert?

Probier den angehängten Hex-File mal aus. Der ist für den mega8535 mit 1 
MHz kompiliert.

Pin Belegung:
Eingang:
  Servosignal     PD2

LED-Ausgänge:
  Posi              PB1..PB3
  Blitz     PB4, PB5
  Doppelblitz  PB6, PB7
  Landelicht  PD0, PD1, PD3..PD7

MfG
Rainer

von Peter L. (imax2010)


Lesenswert?

Hey cool danke jetzt funktionierts perfekt. Lags wirklich nur an der 
Frequenz, dass das Blinken nicht ging?

Werde jetzt selber nochmal der idee von oben nachgehen (mit dem Taster) 
und das probieren zu schreiben.

Mfg
Peter

von Rainer (Gast)


Lesenswert?

Die ganzen Zeitkonstanten für den Blitzablauf habe ich geändert.

Damit die Ablaufgeschwindigkeit unabhängig vom Prozessor wird - ich habe 
hier auf einem mega168 mit 20 MHz getestet - verwende ich die Funktion 
_delay_ms() und habe mir für die Lesbarkeit ein paar Konstanten für die 
Bitmuster definiert.

#include <util/delay.h>
...
#define LIGHT_POSI    _BV(PB1) | _BV(PB2) | _BV(PB3)
#define LIGHT_WHITE   _BV(PB6) | _BV(PB7)
...
// Timing in milliseconds
#define TIME_FLASH   20     // Flash duration             ( 3000)
#define TIME_GAP    100     // Gap between white flashes  ( 3000)
#define TIME_DELAY  200     // Delay white -> red flash   (10000/50000)
#define TIME_PAUSE  800     // Pause for flashing lights  (50000)
...
PORTB = LIGHT_POSI | LIGHT_WHITE;  // position+whiteflash pins on (207)
_delay_ms(TIME_FLASH);             // wait "on" time
...

Mfg
Rainer

von Peter L. (imax2010)


Lesenswert?

Danke nochmal. So sieht der Code von mir aus gesehen auch übersichlicher 
aus als der alt

Mfg
Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.