Verloren im Informationsdschungel - Koptersteuerung - wie und womit?

Status
Nicht offen für weitere Antworten.
#22
..Du hast von Elektronik keine Ahnung, 99% vergessen, und willst, ich zitiere, die Funkfernsteuerung SELBER bauen? Wie stellst Du Dir das vor? Für sowas brauchst Du ein DSO, ein Speki, HF Kenntnisse, Kenntnisse in der De- und -Modellierung von Signalen, und und und. Nicht bös' gemeint aber bau' Dir zuerst einen flipflop mit einer blinkenden LED.
Wieso ist 99% vergessen gleichbedeutend mit keine Ahnung?
Als Jugendlicher war ich Hobbyelektroniker und irgendwann hatte ich mal E-Technik studiert..Fachrichtung Nachrichtentechnik.
ABgesehen davon, dass ich momentan tatsächlich keine Funkfernsteuerung aus der Hand schütteln könnte, habe ich das auch nie vorgehabt. Es gibt genügend fertige Baugruppen, die nur passend kombiniert werden müssen.
Ist halt nur nicht ganz so einfach, wenn man nicht, welche Steller man benötigt und wozu.

Jedenfalls bin ich eine Woche weiter und noch verwirrter, mit YAW etc kann ich immer noch nicht mehr anfangen.
NUr die Arduino Geschichte hat sich vermutlich erledigt, ohne ATMega2560 wird das wohl nix.
Und da der in heutiger Zeitrechnung ebenfalls von gestern ist wird es wohl auf STM32 hinauslaufen.
Dann halt von Anfang an und nicht erst beim Carbongestell, zumal lt. einem Boardmitglied das zwischenzeitlich georderte Entwicklungsboard bereits wohl einen kompletten FC darstellt, nur halt im Überformat.
 

Raketenschnecke

Erfahrener Benutzer
#23
wenn das alles so einfach ist, frage ich mich, wieso es nicht schon hunderte veröffentlichte Projekte im Web gibt....

Ich steige auch grad (wieder neu) ins Thema ein, komme aus einem technischen Beruf, habe gewisse Elektronik-Kenntnisse. Will sagen: ich kann halbwegs beurteilen, was in diesem Kontext passiert. Aber ich würde nicht auf die Idee kommen, das so mir nichts - dir nichts aus dem Stand selber aufzubauen.
Wozu auch? Es gibt Hersteller, die haben so viel davon, dass die das sogar verkaufen.

und wenn im Erstaufschlag steht
Zitat
von Elektronik keine Ahnung, 99% vergessen,
dann bleibt dem geneigten Leser nichts anderes übrig, als diese Aussage ernst zu nehmen.

Irgendwie scheint mir, dass manch einer entweder sich selbst völlig überschätzt oder aber kein bischen Respekt vor den etablierten Technologien hat. Vielleicht auch beides.

*kopfschüttel*
 

d3frost

bsst jetzt nix mehr Licht
#24
Ich finde nur komisch das man beim Zusammenstellen einer Funke ( aus Einzelteilen ) weniger Bauchschmerzen bekommt als bei den Begriffen Yaw Roll oder Nick.

Egal wie es ist ob Du dir das zutraust oder nicht würde ich Dir trotzdem zu einer gekauften Funke raten nur um einmal ein Gefühl dafür zu bekommen wie sich das anfühlen sollte wenn etwas richtig funktioniert.

Eine Taranis ist für unter 200 € zu bekommen , ich glaube nicht das Du beim Selbstbau viel sparen kannst.

In Abwandlung eines Werbespots " schraubst Du noch ? Oder fliegst Du schon ?"
 
#25
Dem kann ich mich nur anschließen.
Ein ehemaliger Mathepauker sagte mal..eine Minimalanforderung ist, lesen zu können

Ich habe an keiner Stelle geschrieben, dass ich keine Ahnung hätte.

Es ist aber nun mal so wie es ist, vielleicht habe ich die Vokalel "YAW" irgendwann einmal erblickt, ich habe sie dann aber auch schnellstens wieder vergessen. Lesen ist das eine, verstehen ist was anderes, ich habe da keinen Draht, keinen Zugang, bislang hatte ich diebezgl. nie auch nur die geringste Berührung.
 

Raketenschnecke

Erfahrener Benutzer
#26
ok, ich zitiere etwas ausführlicher, mit Link auf die Quelle ;-)
......
2. Von Tuten und Blasen habe ich Nullkommanull AHnung. Nullkommanull in Bezug auf den RC-Bereich, in grauer Vorzeit hatte ich mal eine Märklin Eisenbahn, davor Lego....
Soll heißen, ich habe noch eine Fernsteuerung in den Händen gehabt.
Ich habe auch noch nie einen Quadcopter o.ä. in Realität gesehen, nur mall das ein odere Modellflugzeug beim Radfahren..

Meine Vorkenntnisse: Null.
....
 

flyfan

Erfahrener Benutzer
#27
Was vesprichst du dir denn von einem Selbstbau einer Funke?
Das sie besser ist, mehr kann als käufliche?
Das sie zuverlässiger ist?
 
#28
Juhu, neues Popcorn!!!

Mein Vater war RZ-Leiter und hat trotzdem heute schwer mit seinem PC zu kämpfen... Soll heißen, wenn zu viel/zu lange dazwischen liegt, sind die eigenen Kennntnisse nicht mehr so viel wert und "mal" Elektrotechnik studiert zu haben, reicht unter Umständen nicht. Ich kann mich ja bei Dir irren, aber ansonsten sind halt auch Deine Äußerungen und Dein Verhalten bzw. sehr chaotisch bzw. unstrukturiert und auch stur, was das Vertrauen in Deine Fähigkeiten einen eigenen Copter bzw. eine RC Fernsteuerung selbst zusammenzubauen nicht gerade erhöht.
- Klar kann man auch eine Funke selber bauen, es macht aber kaum jenand hier, da es da schon fertig schöne Sachen gibt, die allein zu bedienen schon komplex genug ist und Einarbeitung und Bereitschaft dazu erfordert. Außerdem bist Du in der Rubrik Copter und wir gehen bisher davon aus, Du willst möglichst bald einen Copter in der Luft haben und beherrschen und verstehen. Wenn Dein vorrangiges Ziel der Selbstbau eine Funke ist, wäre die RC Rubik sinnvoller, einen Copter wirst Du dann damit aber dieses Jahr nicht mehr zuverlässig in die Luft bekommen. Bezüglich Copterfliegen wollen ist das aber so, als ob jemand Autofahren und einfache Autoreparaturen lernen will, aber keine Ahnung (mehr) von der Technik hat und dann als erstes sich in die Kopf setzt, die elektronische Einspritzung oder die Lambdasondenregelung selbst zu bauen, anstatt erstmal eine Fahrschule oder einen Selbsthilfe-Reparaturkurs zu besuchen.
- Die meisten hier sind auch nicht perfekt oder allwissend, aber bezüglich Copter deutlich weiter als Du, trotzdem schlägst Du weiterhin obwohl Du danach gefragt hast jeden Rat aus, der Deinen bisherigen (noch sehr fehlerhaften) Meinungen dazu widerspricht oder der Dir nicht gefällt. Die meisten haben so angefangen und gelernt, wie sie es Dir empfehlen und die meisten haben auch mehr oder weniger große technische Vorkenntnisse und Interesse daran, ohne das ist hier sicher niemand dabei.
- Du wirfst weiterhin dauernd Begriffe durcheinander, die nicht zusammenpassen oder wiederholst ohne sie selbst bewerten zu können aufgeschnappte Details und Urteile/Voruteile zu einzelnen Komponenten/Versionen/Typen, die für die ersten (und zweiten und dritten) Schritte, die Du machen solltest, völlig unwichtig oder sogar falsch sind. Stichwort Lambdasonde... Bzw. Du machst Dir vor der ersten Fahrstunden Gedanken, ob das Auto dafür 1PS mehr oder weniger oder Reifen in 225 oder 235 oder vorn Marke x oder y haben muss. Und das bei Komponenten bzw. FCs, die für die ersten Copter 15-40 Euro kosten, die man also jederzeit tauschen bzw, sich auch mehrere verschiedene davon leisten kann.

Ablauf für Dich (für fast jeden!):
1.) Fertigcopter zwischen 30 und 70g kaufen (Modelle wurden schon erwähnt)
2.) Ein paar Wochen später/wenn Du den beherrschst und Spaß dran gefunden hast, beginnen einen Standardselbstbaucopter mit 8-9 Zoll Propellern aufzubauen (Standard FC wie KK2 oder einfache MW, SimonK ESCs, 30-50g Motoren, dazu gibt es genug Bauberichte und threads)
und mit einer (fertigen) Standardfunke fliegen. Nicht sich in Details wie Prozessor oder Funke verlieren.
3.) Viele Monate damit üben/spielen/experimentieren (fliegen wie basteln) und ausbauen
4.) 1-2 weitere Jahre später mal einen besseren Copter für eine mittelgroße Kamera aufbauen. Dann kannst Du auch selbst beurteilen, welche FC Du da brauchst bzw. welches Modell bzw. welche Komponenten welche Vor -und Nachteile hat

Gruß
Jo
 
#29
ok, ich zitiere etwas ausführlicher, mit Link auf die Quelle ;-)
und das gilt nach wie vor, ich habe nur 1 Woche mehr Lesewissen..und grau ist alle Theorie.

Was vesprichst du dir denn von einem Selbstbau einer Funke?
Ganz einfach, dass sie auf die notwendigen Bestandteile beschränkt ist. Was soll ich mit 16 Kanälen und 20 Schaltern wenn 8 Kanäle und drei Schalter reichen?
Momentan habe ich die Wahl zwischen zwei Gehäusen, wahrscheinlich werde ich beide ordern und zwei Varianten bauen, eine spartanisch mit mikro Arduino und eine mit ATMega plus I2C Display, Konfiguration sowie Telemetrie mittels eines Androiden.
Über notwendige Schalter muss ich noch nachdenken, da hab ich immer noch kein klares Bild.
 

flyfan

Erfahrener Benutzer
#30
Ganz einfach, dass sie auf die notwendigen Bestandteile beschränkt ist. Was soll ich mit 16 Kanälen und 20 Schaltern wenn 8 Kanäle und drei Schalter reichen?
Das ist natürlich ein Grund!
Echt Mist, das man die zuviel angebotenen Kanäle auch benutzen muss und das die soooo viel Strom mehr verbrauchen ....
Das bislang kein Hersteller auf die Idee kam, eine 8 Kanal Funke mit nur einigen Schaltern herzustellen, unglaublich.
1. Treffer bei Ebay: Das ist ja was ganz anderes

Aber ich kenne das, mein Auto wurde auch nur mit einem 6 Gang Getriebe angeboten, da habe ich mir auch paar Teile gekauft und gegoogelt, jetzt habe ich 7 Gänge (bzw. in paar Jahren, wenn ich endlich fertig bin und alles so funktioniert wie es in den Anleitungen im Internet steht).
 
Zuletzt bearbeitet:

d3frost

bsst jetzt nix mehr Licht
#31
Wow, hier wirds garantiert noch lustig. Hast Du auch dein Handy selbst gebaut? Ist doch bestimmt auch ein haufen Mist drin den Du nicht brauchst
 
#32
Ich weiß gar nicht, was Ihr alle habt. Wenn er das Gehäuse für die Funke schon hat, ist doch praktisch alles in trockenen Tüchern!

Mist, und so ein thread ausgerechnet jetzt, wo ich mir Chips und Popcorn die nächste Zeit verkneifen muss (heute morgen seit langem mal wieder auf der Waage gewesen...) :(
 
#33
Ich lenke ein wenig ein. Du hast scheinbar größere E-Kenntnisse und auch nicht so veraltet.
Trotzdem kann ich wie konus im anderen thread nicht verstehen, warum Du ständig das Rad neu erfinden willst. Was spricht dagegen, erstmal fertige Lösungen zu benutzen und ersta nachher, wenn Du ein wenig fliegen kannst und auch in der Praxis weißt, wie sich welches Bauteil oder welcher Code auf das Flugverhalten auswirkt, die fertigen Bauteile mal genauer zu untersuchen, was man da evtl. noch besser machen könnte/wo gespart wurde.
Und wie willst Du überhaupt ein vernüftiges "Produkt", eine vernüftige RC-Fernsteuerung entwickeln/selber aufbauen, wenn Du noch gar nicht weißt, was man damit macht bzw. wie, was Kanäle sind, wozu, wie viele man braucht, wie sie heißen, etc.? Es reicht ja auch nicht einem Schiffsingenieur nur zu sagen "He, bau mal ein Auto, das sind so Dinger die da so rollen...", der muss auch erst die Anforderungen und Eigenschaften von Autos lernen.

Um aber mal das blöde "Yaw" lozuwerden: Flug(modelle) werden in der Regel über 3 Achsen gesteuert, längs, quer, hoch. Die Drehung um die jeweilige Achse heißt Rollen/roll um die Längsachse, Nicken/nick um die Querachse und Gieren/Yaw um die Hochachse. Dann noch gas/throttle dazu und fertig ist die Mindestflugmodellsteuerung. Pitch ist beim Copter nicht nötig bzw. wie Du schon festgestellt hast, ist der Anstellwinkel der Props bei uns (meist...) fest, nur die Hälfte rechtsrum, die Hälfte linksrum.
Andere Begriffe wurden schon erläutert, aber auch da hilft meist erstmal googeln ...
 

Kholdstare

Erfahrener Benutzer
#34
und das gilt nach wie vor, ich habe nur 1 Woche mehr Lesewissen..und grau ist alle Theorie.


Ganz einfach, dass sie auf die notwendigen Bestandteile beschränkt ist. Was soll ich mit 16 Kanälen und 20 Schaltern wenn 8 Kanäle und drei Schalter reichen?
Momentan habe ich die Wahl zwischen zwei Gehäusen, wahrscheinlich werde ich beide ordern und zwei Varianten bauen, eine spartanisch mit mikro Arduino und eine mit ATMega plus I2C Display, Konfiguration sowie Telemetrie mittels eines Androiden.
Über notwendige Schalter muss ich noch nachdenken, da hab ich immer noch kein klares Bild.
Du bist echt zu geil. Denkst über die dafür notwendigen Schalter nach? Im Ernst jetzt? Vielleicht entprellte nehmen, oder doch welche mit Goldkontakten? Den Empfänger baust wie? Nen Atmel nehmen, ein langes Kabel an Input in, und fertig ist der Empfangsteil? Auf welcher Frequenz willst den Sender betreiben? Hast Du einen Quartz, der bei Deiner Wunschfrequenz anschwingt, und, wie sieht der Schaltplan dafür aus? Welche Sendeleistung strebst Du an, und wie weit möchtest Du damit kommen?
 

Raketenschnecke

Erfahrener Benutzer
#35
Ich glaube nicht, dass die Diskussion hier auf fruchtbaren Boden fällt. Der TO ist der Meinung, ohne Erfahrung und mit Null-Ahnung eine Fernsteuerung selbst zu entwickeln. Sämtliche Warnungen/Hinweise/Einwände wurden negiert oder ignoriert. Sieht sehr nach Beratungsresistenz aus.
 

gismojs

Form follows function.
#37
Meint ihr nicht auch, daß uns der kleine Lilienthal eher ein wenig auf den Arm nimmt?
 

Kholdstare

Erfahrener Benutzer
#39
Hier ist der source für einen Telemetrie Sender auf 433Mhz:

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.5 Standard
Automatic Program Generator
® Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : Telemetrie Sender
Version : 1,1
Date : 07.05.2009
Author : Wilhelm Krug
Company : 92345 Dietfurt, Germany
Comments:


Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

/****************************************************
Dieses Programm liest 2 Spannungswerte + 2 Temperaturwerte + Drehzahl
mittels A/D Wandler ein und sendet diese Daten mittels eines RFM 02 Funkmoduls
(Sender) von Pollin aus. Die berechnete Checksumme wird dem Signal angehõngt.
Das Sendesignal hat das Format:
Ein Startframe lautet 0xAA 0xAA 0xAA 0x2D 0xD4
Dieses Startframe wird vor den eigentlichen Daten gesendet
und vom FiFo Puffer des Empfõngers ausgeblendet.
Jetzt folgen die eigentlichen Daten:
$x1,x2,x3,...xn#cscs<cr><lf>
Das '$' ist das Startzeichen einer Zeile.
x1... Sind die ³bertragenen Werte
'#' Kennzeichnet das Ende des Datenbereiches
cs cs ist das High und Low Nibble der Checksumme in ASCII Codierung
Die Checksumme ist das Ergebnis einer EXOR Verkn³pfung
aller Bytes von '$' bis '#'
Das Ende einer ▄bertragung wird durch die Sequenz <CR><LF> gekennzeichnet.

Ab Dip Fix Stellung 22 wird immer der gleiche Kanal gesendet!
Zuordnung: Dip Fix - Kanõle - Frequenz
Dip Fix:Kanal:Frequenz
Dip Kanal Frequenz
xxx 01 433.075 MHz
00 02 433.100 MHz
xxx 03 433.125 MHz
xxx 04 433.150 MHz
01 05 433.175 MHz
xxx 06 433.200 MHz
xxx 07 433.225 MHz
02 08 433.250 MHz
xxx 09 433.275 MHz
xxx 10 433.300 MHz
03 11 433.325 MHz
xxx 12 433.350 MHz
xxx 13 433.375 MHz
04 14 433.400 MHz
xxx 15 433.425 MHz
xxx 16 433.450 MHz
05 17 433.475 MHz
xxx 18 433.500 MHz
xxx 19 433.525 MHz
06 20 433.550 MHz
xxx 21 433.575 MHz
xxx 22 433.600 MHz
07 23 433.625 MHz
xxx 24 433.650 MHz
xxx 25 433.675 MHz
08 26 433.700 MHz
xxx 27 433.725 MHz
xxx 28 433.750 MHz
09 29 433.775 MHz
xxx 30 433.800 MHz
xxx 31 433.825 MHz
10 32 433.850 MHz
xxx 33 433.875 MHz
xxx 34 433.900 MHz
11 35 433.925 MHz
xxx 36 433.950 MHz
xxx 37 433.975 MHz
12 38 434.000 MHz
xxx 39 434.025 MHz
xxx 40 434.050 MHz
13 41 434.075 MHz
xxx 42 434.100 MHz
xxx 43 434.125 MHz
14 34 434.150 MHz
xxx 45 434.175 MHz
xxx 46 434.200 MHz
15 47 434.225 MHz
xxx 48 434.250 MHz
xxx 49 434.275 MHz
16 50 434.300 MHz
xxx 51 434.325 MHz
xxx 52 434.350 MHz
17 53 434.375 MHz
xxx 54 434.400 MHz
xxx 55 434.425 MHz
18 56 434.450 MHz
xxx 57 434.475 MHz
xxx 58 434.500 MHz
19 59 434.525 MHz
xxx 60 434.550 MHz
xxx 61 434.575 MHz
20 62 434.600 MHz
xxx 63 434.625 MHz
xxx 64 434.650 MHz
21 65 434.675 MHz
xxx 66 434.700 MHz
xxx 67 434.725 MHz
22 68 434.750 MHz
xxx 69 434.775 MHz
Alle DIP FIX mit g³ltigen Werten versehen !
23 68 434.750 MHz
24 68 434.750 MHz
25 68 434.750 MHz
26 68 434.750 MHz
27 68 434.750 MHz
28 68 434.750 MHz
29 68 434.750 MHz
30 68 434.750 MHz
31 68 434.750 MHz
****************************************************/


#include <mega8.h>
#include <stdlib.h>
#include <string.h>
#include <delay.h>
#asm
.equ tcnt0=0x32
.equ portb=0x18
.equ portd=0x12
.equ sdi=0 ;PortB,0
.equ sck=1 ;PortB,1
.equ nsel=2 ;PortB,2
.equ fsk=1 ;PortD,1
.equ nirq=2 ;PortD,2
#endasm

// Declare your global variables here
// Frequenzwert f³r das RFM 02
flash unsigned int ui_frequ[32]={1240,1270,1300,1330,1360,1390,1420,1450,1480,1510,1540,1570,1600,1630,1660,1690,1720,1750,1780,1810,1840,1870,1900,1900,1900,1900,1900,1900,1900,1900,1900,1900};
eeprom signed int ee_tempzero[2]={0,0}; /* (249) A/D Wandlerwert f³r 0░C "(A/D Wandler - X) *290 / tempfakt" */
eeprom signed int ee_tempfakt[2]={290,290}; /* (461) Teilerfaktor f³r Temperatursteilheit "(A/D Wandler - tempzero) *290 / X" */
eeprom unsigned int ee_voltfakt=360; /* (500) Multiplikator f³r Spannungsmessung "A/D Wandler * X / 360" */
eeprom unsigned int ee_voltfakt2=360; /* (590) Multiplikator f³r Spannungsmessung "A/D Wandler * X / 360" */

bit new_sec=0;
bit new_value=0;
bit new_drimp=0; /* Eine neue Drehzahlmessung liegt vor */
bit sendung_aktiv=0;
volatile unsigned int ui_time=0; /* Anzahl der Datentelegramme jede Sekunde = +1*/
volatile unsigned long int li_voltage1; /* Spannung 1 = Akkuspannung */
volatile unsigned long int li_voltage2; /* Spannung 2 = minimale Akkuspannung */
volatile unsigned long int li_voltage3; /* Spannung 3 = Externe Spannungsmessung */

volatile signed long int li_temp1; /* Temperatur 1 max 300░C */
volatile signed long int li_temp2; /* Temperatur 2 max 300░C */

volatile signed int si_tempzero[2]; /* Korrekturfaktor f³r Temperatur 1+2 Nullpunkt siehe EEPROM */
volatile signed int si_tempfakt[2]; /* Korrekturfaktor f³r Temperatur 1+2 Steiheit siehe EEPROM */

volatile unsigned int ui_voltfakt; /* Speichervariable f³r Spannungsmessung */
volatile unsigned int ui_voltfakt2; /* Speichervariable f³r Spannungsmessung ext. */

volatile unsigned long int li_timer; /* Timer f³r Drehzahlbestimmung */
volatile unsigned long int li_oldtimer; /* Alte Timerwerte f³r Subtraktion */
volatile unsigned long int li_drwert=0; /* Berechneter Drehzahlwert */
volatile unsigned long int li_drmittel=0; /* Gemittelte Drehzahlwerte Periodendauermessung */
volatile unsigned char uc_stellen; /* Anzahl der in die Berechnung eingeflossenen Messwerte */

volatile unsigned long int li_drehzahl; /* Drehzahlwert */
volatile unsigned int ui_intpulses=0; /* Impulszõhler im Interrupt (Drehzahlmessung) */
volatile unsigned int ui_drpulses=0; /* Impulszõhler im Hauptprogramm (Drehzahlmessung) */
volatile unsigned char uc_blatt=1; /* Impulse pro umdrehung (1...4)*/

volatile unsigned char uc_sendbuffer[127]; /* Sendepuffer */
volatile unsigned char uc_sendbyte=0; /* Zeiger aktuelles Sendebyte */
volatile unsigned char uc_sendbit=0; /* Zeiger aktuelles Sendebit */
volatile unsigned char uc_overflow=0; /* overflow Zõhler - Resettet RFM 02 */
volatile unsigned char uc_kanal; /* gewõhlter Kanal */
volatile unsigned int ui_timer; /* ▄berlaufzõhler f³r Timer 1 - 1 Sekunde */


// Sende ein Byte zum RFM 02
void sendbyte(volatile unsigned char uc_byte)
{
#asm
push r26 ;Register retten
in r26,sreg
push r26
push r27
ldi r26,8 ;Schleifenzõhler mit 8 laden
ld r27,y ;uc_Byte vom Ram holen

sendloop:
tst r26 ;Schleifenzõhler eins runterzõhlen
breq endsend
dec r26
clc
rol r27 ;High Byte ins Carry schieben
brcs send1 ;Bei 1 -> High ausgeben
cbi portb,sdi ;Bei 0 -> Low ausgeben
rcall clockpulse
rjmp sendloop

send1:
sbi portb,sdi
rcall clockpulse
rjmp sendloop

clockpulse:
nop
nop
nop
sbi portb,sck ;Clock Port auf 1 setzen
nop
nop
nop
nop
nop
nop
cbi portb,sck ;Clock Port auf 0 setzen
nop
nop
nop
ret ;Zur³ck zur aufrufenden Routine

endsend:
cbi portb,sdi ;SDI Port auf 0 setzen zwecks kosmetik
pop r27
pop r26
out sreg,r26
pop r26
#endasm
}

// External Interrupt 0 service routine sende Bits zum RFM 02
interrupt [EXT_INT0] void ext_int0_isr(void)
{
volatile unsigned char uc_buffer;
uc_sendbit--;
uc_buffer=(uc_sendbuffer[uc_sendbyte])&(1<<uc_sendbit);
if (uc_buffer == 0)
{
#asm ("cbi portb,sdi");/*Eine 0 wird gesendet*/
}
else
{
#asm ("sbi portb,sdi");/*Eine 1 wird gesendet*/
}


/* Alle 8 Bits schon ³bertragen ? */
if (uc_sendbit==0)
{
uc_sendbyte++;
uc_sendbit=8;
}
if (uc_sendbyte>(strlen (uc_sendbuffer)))
{
/* Ende der ▄bertragung */
uc_sendbyte=0;
uc_sendbit=8;
GICR&=0b10111111;/*Interrupt 0 sperren*/
/* ▄bertragung durch setzen des nSEL Ports beenden */
#asm ("sbi portb,nsel");
#asm ("nop");
/* Power Managment Command= Enable Clock; disable Synthesizer; disable pow. Ampl. */
#asm ("cbi portb,nsel");
sendbyte(0b11000000);
sendbyte(0b00100000);
#asm ("sbi portb,nsel");
sendung_aktiv=0;
uc_overflow=0; /* Zeit³berwachung zur³cksetzen */
}
}


/* Turn registers saving off */
#pragma savereg-
// External Interrupt 1 service routine Drehzahlmesser impulseingang
interrupt [EXT_INT1] void ext_int1_isr(void)
{
new_drimp=1;
#asm
PUSH r26
IN r26,SREG
PUSH r26
PUSH r27
SEI
;*** Erste Phase der Drehzahlermittlung mittels Timerabfrage = Periodendauermessung ***
IN r26,TCNT0 ;Aktuelle Zeit holen
CLI
LDS r27,(_li_oldtimer) ;Vorherigen Wert holen
STS (_li_oldtimer),r26 ;Vorheriger alten Wert ³berschreiben
SUB r26,r27 ;Unterschied berechnen
STS (_li_drwert),r26 ;Die berechnung als Wert abspeichern

LDS r26,(_li_timer+1) ;Das gleiche f³r die 2te Stelle _li_timer+1 ist der ³berlauf des TCNT0
LDS r27,(_li_oldtimer+1)
STS (_li_oldtimer+1),r26
SBC r26,r27
STS (_li_drwert+1),r26

LDS r26,(_li_timer+2) ;Das gleiche f³r die 3te Stelle
LDS r27,(_li_oldtimer+2)
STS (_li_oldtimer+2),r26
SBC r26,r27
STS (_li_drwert+2),r26

LDS r26,(_li_timer+3) ;Das gleiche f³r die 4te Stelle
LDS r27,(_li_oldtimer+3)
STS (_li_oldtimer+3),r26
SBC r26,r27
STS (_li_drwert+3),r26

;*** Zweite Phase der Drehzahlermittlung mittels Pulszõhlung ***
LDS r26,(_ui_intpulses)
INC r26
STS (_ui_intpulses),r26
BRNE ENDINT1
LDS r27,(_ui_intpulses+1)
INC r27
STS (_ui_intpulses+1),r27
ENDINT1:
POP r27
POP r26
OUT SREG,r26
POP r26
#endasm;
}



// Timer 0 overflow interrupt service routine Drehzahlmesser Pulsdauermessung
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
#asm
PUSH r26
IN r26,SREG
PUSH r26
LDS r26,(_li_timer+1)
INC r26
STS (_li_timer+1),r26
BRNE ENDINT0
LDS r26,(_li_timer+2)
INC r26
STS (_li_timer+2),r26
BRNE ENDINT0
LDS r26,(_li_timer+3)
INC r26
STS (_li_timer+3),r26
ENDINT0:
POP r26
OUT SREG,r26
POP r26
#endasm
}
/* re-enable register saving for the other interrupts */
#pragma savereg+


// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
/* 1 Sekunde */
ui_timer++;
if (new_drimp>0)
{
li_drmittel+=li_drwert; /* Aufaddierung f³r Drehzahlmittelwertbildung */
uc_stellen++; /* Aufaddierung der St³tzstellen */
new_drimp=0; /* Neue Drehzahl Flag l÷schen*/
};
if (ui_timer>19)
{
ui_drpulses=ui_intpulses;
ui_intpulses=0;
ui_timer=0;
new_sec=1;
uc_overflow++;
}
}

#define ADC_VREF_TYPE 0xC0

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}


// Das Sendemodul RFM 02 initialisieren
void init_rfm02(void)
{
volatile unsigned char uc_frequ[2]; /* Frequenz tuningword */
uc_frequ[1]=ui_frequ[uc_kanal]/256;
uc_frequ[1]|=0b10100000;
uc_frequ[0]=ui_frequ[uc_kanal]%256;
/* Configuration Setting: 433MHz, CLK 5MHz, 11,5pf Kapaz., +/-60kHz */
#asm ("cbi portb,nsel");
sendbyte(0b10001110);
sendbyte(0b01100000);
#asm ("sbi portb,nsel");
#asm ("nop");

/* Frequency Setting: eingestellter Kanal*/
#asm ("cbi portb,nsel");
sendbyte(uc_frequ[1]);
sendbyte(uc_frequ[0]);
#asm ("sbi portb,nsel");
#asm ("nop");

/* Output Power Command: Max Power */
#asm ("cbi portb,nsel");
sendbyte(0b10110000);
#asm ("sbi portb,nsel");
#asm ("nop");

/* Data Rate Command: 2400 bit/s */
#asm ("cbi portb,nsel");
sendbyte(0b11001000);
sendbyte(0b10001111);
#asm ("sbi portb,nsel");
#asm ("nop");

/* Low Batt + Sync Command: enable Sync Circuit */
#asm ("cbi portb,nsel");
sendbyte(0b11000010);
sendbyte(0b00100000);
#asm ("sbi portb,nsel");
#asm ("nop");

/* PLL Setting Command: 0xD240 up to 19,2kbit/s*/
#asm ("cbi portb,nsel");
sendbyte(0b11010010);
sendbyte(0b01000000);
#asm ("sbi portb,nsel");
#asm ("nop");

/* Power Managment Command= Enable Clock; disable Synthesizer; disable pow. Ampl. */
#asm ("cbi portb,nsel");
sendbyte(0b11000000);
sendbyte(0b00100000);
#asm ("sbi portb,nsel");

}

// Eine Sendung eines Strings starten
void sendbuffer (void)
{
sendung_aktiv=1; /* Flag f³r Sendung lõuft setzen */
uc_sendbit=8;
uc_sendbyte=0;
GIFR=0x40; /*Anstehende Interrupts 0 l÷schen*/
/* Power Managment Command= Enable Clock; enable Synthesizer; enable pow. Ampl. */
#asm ("cbi portb,nsel");
sendbyte(0b11000000);
sendbyte(0b00111000);
#asm ("sbi portb,nsel");
#asm ("nop");
/*Sender Start Byte senden*/
#asm ("cbi portb,nsel");
sendbyte(0b11000110);
GICR|=(1<<6);/*Interrupt 0 freigeben*/
/* Der Rest der Sendung lõuft nun in der Interupt 0 Routine ab */
}

// Werte ermitteln
void get_value (void)
{
li_voltage1=read_adc(0);
li_voltage2=read_adc(1);
li_voltage3=read_adc(6);
li_temp1=read_adc(2);
li_temp2=read_adc(3);
//Drehzahlermittlung
if (ui_drpulses<3) /* Drehzahlen unter 120 U/min werden ignoriert */
{
li_drehzahl=0;
}
else
{
if (ui_drpulses<350) /* Entscheidung welches Drehzahlermittlungsverfahren angewendet wird bei 21000 U/min*/
{
li_drmittel=li_drmittel/uc_stellen; /* Mittelwert der Drehzahlmessungen errechnen */
li_drehzahl=7500000/(li_drmittel*uc_blatt); /* Periodendauermessung */
}
else
{
li_drehzahl=ui_drpulses; /* Pulszõhlung in Torzeit ( 1Sekunde )*/
li_drehzahl=(li_drehzahl*60)/uc_blatt;
}
}
ui_drpulses=0; /* Pulszõhlung zur³cksetzen */
li_drmittel=0; /* Mittelwertbildner zur³cksetzen */
uc_stellen=0; /* St³tzstellenzõhler zur³cksetzen */

// Werteberechnung 2x Spannung 2x Temperatur
li_voltage1=(li_voltage1*ui_voltfakt)/360;
li_voltage2=(li_voltage2*ui_voltfakt)/360;
li_voltage3=(li_voltage3*ui_voltfakt2)/360;

if (li_temp1==1023)
{
li_temp1=0;
}
else
{
#asm("cli");
li_temp1=((li_temp1-si_tempzero[0])*290)/si_tempfakt[0];
#asm("sei");
}
if (li_temp2==1023)
{
li_temp2=0;
}
else
{
#asm("cli");
li_temp2=((li_temp2-si_tempzero[1])*290)/si_tempfakt[1];
#asm("sei");
}
}


// Checksumme berechnen - EXOR Verfahren
void checksum (void)
{
volatile unsigned char uc_check[3]={0,0,0}; /* (Checksummenpuffer)*/
volatile unsigned char uc_stringlengh;
volatile unsigned char uc_i=0;
uc_stringlengh=strlen(uc_sendbuffer);
for (uc_i=5; uc_i<uc_stringlengh ;uc_i++) /* Die relevanten Bytes f³r Checksumme ermitteln */
{
uc_check[0]^=uc_sendbuffer[uc_i]; /* Checksumme errechnen */
}
// Checksumme in ASCII umwandeln
uc_check[1]=uc_check[0];

uc_check[0]&=0xF0; /* Higher Nibble to ASCII */
uc_check[0]=(uc_check[0]>>4);

if (uc_check[0]>9)
{
uc_check[0]=uc_check[0]+0x37;
}
else
{
uc_check[0]|=0x30;
}
uc_check[1]&=0x0F; /* Lower Nibble to ASCII */

if (uc_check[1]>9)
{
uc_check[1]=uc_check[1]+0x37;
}
else
{
uc_check[1]|=0x30;
}

uc_check[2]=0; /* Einf³gen wegen Stringverarbeitung */
strcat (uc_sendbuffer,uc_check); /* Checksumme anhõngen */
}

// Sendestring vorbereiten
void builtstring (void)
{
unsigned char uc_stringbuffer[10];
volatile unsigned char uc_stringlengh;

uc_sendbuffer[0]=0xAA;
uc_sendbuffer[1]=0xAA;
uc_sendbuffer[2]=0xAA;
uc_sendbuffer[3]=0x2D;
uc_sendbuffer[4]=0xD4;
uc_sendbuffer[5]='$';
uc_sendbuffer[6]='3';
uc_sendbuffer[7]=';';
uc_sendbuffer[8]='1';
uc_sendbuffer[9]=';';
uc_sendbuffer[10]=0x00;

itoa (ui_time,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_voltage1,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_voltage2,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_voltage3,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";0;0;0;0;");

ltoa (li_temp1,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_temp2,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_drehzahl,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

checksum(); /* Checksumme ermitteln und anf³gen */

// Stringendebytes anf³gen
uc_stringlengh=strlen(uc_sendbuffer);
uc_sendbuffer[uc_stringlengh]=13; /* Carriage Return 13*/
uc_sendbuffer[uc_stringlengh+1]=10; /* Line Feed 10 */
uc_sendbuffer[uc_stringlengh+2]=0; /* Stringende anf³gen */
}

// Hauptprogramm
void main(void)
{
// Declare your local variables here
li_timer=0;
li_oldtimer=0;
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=P State4=P State3=P State2=1 State1=0 State0=0
PORTB=0x3C;
DDRB=0x07;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=P State4=P State3=T State2=T State1=T State0=T
PORTC=0x30;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In
// State7=P State6=P State5=P State4=T State3=T State2=T State1=0 State0=T
PORTD=0xE0;
DDRD=0x02;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
TCCR0=0x03;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
// CTC Mode : On
TCCR1A=0x00;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0xC3;
OCR1AL=0x4F;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
GICR|=0x80;
MCUCR=0x0A;
GIFR=0xC0;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x11;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 156,250 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;

// EEPROM Werte ins RAM laden
ui_voltfakt=ee_voltfakt;
ui_voltfakt2=ee_voltfakt2;
si_tempzero[0]=ee_tempzero[0];
si_tempzero[1]=ee_tempzero[1];
si_tempfakt[0]=ee_tempfakt[0];
si_tempfakt[1]=ee_tempfakt[1];


uc_blatt=((PINC>>4)&0b00000011)+1; /* Blattzahl f³r Drehzahlmessung ermitteln */
uc_kanal=(PINB>>3)&0b00000111; /* Eingestellten Sendekanal ermitteln */
uc_kanal=uc_kanal|((PIND>>2)&00011000);


init_rfm02();
/*
// Testroutines
strcpyf(uc_sendbuffer,"AAA2d$3;0;0;1029;649;0;0;0;0;0;25;24;0;"); // Check = 1C
checksum();*/

// Global enable interrupts
#asm("sei");

while (1)
{
if (new_sec==1&&sendung_aktiv==0)/* Nach einer Sekunde neue Messwerte erkunden */
{
get_value(); /* Werte berechnen */
builtstring(); /* Sendestring bilden */
new_sec=0; /* Sekundenmarker auf 0 setzen */
ui_time++; /* Sendezeit erh÷hen */
new_value=1; /* Marker - Neue Werte zum senden bereit */
}

if (sendung_aktiv==0&new_value==1)/* Die Messwerte versenden */
{
sendbuffer(); /* Sendung (interruptgesteuert) starten */
new_value=0; /* Neue Werte werden gesendet */
}
if (uc_overflow>2)/* Schlõgt zu wenn eine ▄bertragung lõnger als 3 sek dauert */
{
// Aktive Sendung beenden Interrupts sperren
#asm ("cli");
uc_sendbyte=0;
uc_sendbit=8;
GICR&=0b10111111;/*Interrupt 0 sperren*/
GIFR|=0b01000000;/*Interrupt 0 flag l÷schen */
/* ▄bertragung durch setzen des nSEL Ports beenden */
#asm ("sbi portb,nsel");
#asm ("nop");
// Sender abschalten
/* Power Managment Command= Enable Clock; disable Synthesizer; disable pow. Ampl. */
#asm ("cbi portb,nsel");
sendbyte(0b11000000);
sendbyte(0b00100000);
#asm ("sbi portb,nsel");

sendung_aktiv=0; /* Flag f³r aktive Sendung l÷schen */
uc_overflow=0; /* Zeit³berwachung zur³cksetzen */

// RFM 02 neu initialisieren
init_rfm02();

// Nõchsten Zyklus abwarten - 1 Sekunde
new_sec=0;
new_value=0;

// Interrupts freigeben
#asm ("sei");
}

};
}
 
Status
Nicht offen für weitere Antworten.
FPV1

Banggood

Oben Unten