Variable zwischen unterprogrammen übergeben Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
Variable zwischen unterprogrammen übergeben |
|
|
|
|
BID = 874284
basti2s Gelegenheitsposter
Beiträge: 94 Wohnort: Leutkirch
|
|
Hallo,
so langsam werde ich wahnsinnig.
Ich probiere schon seit tagen herum, komme aber zu keiner Lösung.
Ich habe in meinem C Programm 2 Unterprogramme, im 1. Unterprogramm wird eine Variable durch einen Timer0 hochgezählt, diese soll dann an das 2. Unterprogramm übergeben werden. Ich bekomms einfach nicht hin.
Hier mal mein Programm:
Code : |
#include <htc.h>
__CONFIG (LVP_OFF & WDTE_OFF); //Low Voltage Programming OFF
// Watch dog timer off
void ausgabe (char min_einer);
void main (void)
{
OSCCON= 0b01110111; //Unimplemented
//111 8MHz
//OSTS Internal Oszillator
//HTS HFINTOSC ist stable
//LTS LFINTOSC is stable
//SCS Internal oscillator is used for system clock
TRISC = 0; //Port C als Ausgang
TRISB1 = 0;
TRISB2 = 0;
TRISB3 = 0;
TRISD = 0; //Port D als Ausgang
ANS8 = 0;
ANS9 = 0;
ANS10 = 0;
RB1=1;
RC0=0;
RC2=1;
RB3=0;
RB2=0;
RB3=1;
}
int umrechnen(void) // Rechnet Timer Ausgang in Minuten um, Minuten werden auf "min_einer" ausgegeben.
{
unsigned int ms;
unsigned int min_einer;
unsigned int min_zehner;
OPTION_REG= 0b11000010; //Pull up disable
//Interrupt on rising edge of INT pin
//Internal cycle clock
//Increment on Low to high transition on T0CKI
//PSA assigned to timer0
//Prescaler 1:8
INTCON= 11100100; //Enable all unmasked interrupts
//Enables all unmasked peripheral interrupts
//Enables the INT external interrupt
//Disables the INT external interrupt
//Disables the PORTB change interrupt
//TMR0 Register has overflowed (cleared in software)
//INT external interrupt did not occur
//None of the PORTB general purpose I/O pins have changed state
TMR0 = 0; //Timer0 auf 0 Setzen
T0IF = 0; //Interrupt Flag zurücksetzen
PORTC=0b00000000; //PORTC rücksetzen
TMR0 = 6;
if (T0IF)
{
ms=ms+1; //Counter bei Timerüberlauf um 1 erhöhen
T0IF=0; //Interrupt Flag zurücksetzen
TMR0=6; //Timer preload auf 6 stellen
}
if (ms==60000)
{
min_einer=min_einer+1;
ms=0;
}
if (min_einer==9)
{
min_zehner=min_zehner+1;
min_einer=0;
}
if (min_zehner==9)
{
min_zehner=0;
}
return 0;
}
//-----------------------------------------------------------------------------
void ausgabe(char min_einer)
{
if (min_einer==9) //7Segment 0
{
PORTC=0b00000000;
PORTD=0b00000000;
}
if (min_einer==8) //7Segment 1
{
PORTC=0b00010000;
PORTD=0b00010000;
}
if (min_einer==7) //7Segment 2
{
PORTC=0b00100000;
PORTD=0b00100000;
}
if (min_einer==6) //7Segment 3
{
PORTC=0b00110000;
PORTD=0b00110000;
}
if (min_einer==5) //7Segment 4
{
PORTC=0b01000000;
PORTD=0b01000000;
}
if (min_einer==4) //7Segment 5
{
PORTC=0b01010000;
PORTD=0b01010000;
}
if (min_einer==3) //7Segment 6
{
PORTC=0b01100000;
PORTD=0b01100000;
}
if (min_einer==2) //7Segment 7
{
PORTC=0b01110000;
PORTD=0b01110000;
}
if (min_einer==1) //7Segment 8
{
PORTC=0b10000000;
PORTD=0b10000000;
}
if (min_einer==0) //7Segment 9
{
PORTC=0b10010000;
PORTD=0b10010000;
}
}
|
|
Was mach ich falsch?
Gruß
Bastian |
|
BID = 874327
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
|
BID = 874328
Harald73 Schreibmaschine
Falsches Format *.gif oder *.jpg verwenden!
Beiträge: 1016
|
Hi,
(habe lange nicht mehr selber programmiert...)
Die beiden Unterprogramme werden ja gar nicht im Main aufgerufen. Dort müsstest du dann die Variable an ausgabe übergeben.
Das(char min_einer) führt zu einer neuen Variable min_einer, die nur innerhalb von ausgabe sichtbar ist, stellt aber keine Verknüpfung zu der "zufällig" gleichnamigen Variable in umrechnen her.
Ich denke aber, da ist noch mehr im Argen. min_einer ist einmal unsigned int, ein ander mal char. Außerdem sollte nur das ab "if (T0IF)" zyklich durchlaufen werden, das davor nur einmal. Und das "if" passt nur, wenn du es per IRQ aufrufst (wobei dann das if überflüssig ist) , oder umrechnen "beliebig schnell/oft" aufgerufen wird (was natürlich Rechenzeit verbraucht), da du sonst Takte verpassen könntest.
Gruß
Harald
_________________
*..da waren sie wieder, meine 3 Probleme: 1)keiner 2)versteht 3)mich
* Immer die gültigen Vorschriften beachten und sich keinesfalls auf meine Aussagen verlassen!
[ Diese Nachricht wurde geändert von: Harald73 am 16 Feb 2013 15:34 ]
|
BID = 874440
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Lerne erstmal C vernünftig und erst, wenn du es einigermaßen kannst, wende es auf Mikrocontrollern an.
Debugging auf einem PC ist einfacher als auf einem µC.
UND WIE GESAGT: 0bxxx ist kein sauberes C, sowas gibt es dort einfach nicht!
_________________
|
BID = 874445
ffeichtinger Schreibmaschine
Beiträge: 1050 Wohnort: Traunkirchen im Salzkammergut
|
Offtopic :
|
UND WIE GESAGT: 0bxxx ist kein sauberes C, sowas gibt es dort einfach nicht!
|
Leider. Denn manchmal ist das sehr praktisch. Und gcc kann damit tadellos umgehen. (und womit sollte man denn sonst C oder C++ programmieren? :D)
mfg Fritz
_________________
|
BID = 874453
ffeichtinger Schreibmaschine
Beiträge: 1050 Wohnort: Traunkirchen im Salzkammergut
|
Uups, falsches tag, ich wollte dich nur zitieren und nicht ins OT verschieben.
_________________
|
BID = 874454
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Offtopic :
| Nicht jeder ist so ein Suchtie, dass er schneller ein Nibble korrekt (!) in ein Zeichen umrechnet und dieses eintippt als er für selbiges in Bitschreibweise braucht.
Wens Fehler gibt, fängt die Sucherei an...
MPLABX kennt diese Notation übrigens auch...
Genau wie Bascom (nicht immer brauch man Pointer, Pakete aus einer seriellen Schnittstelle einlesen, zerlegen und darstellen geht z.B. ohne...) |
_________________
|
BID = 874459
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Offtopic :
|
Zitat :
|
MPLABX kennt diese Notation übrigens auch... |
Kein Grund, dass sie dadurch besser wird!
Wir reden über ernsthaftes programmieren.
Zitat :
| (nicht immer brauch man Pointer, Pakete aus einer seriellen Schnittstelle einlesen, zerlegen und darstellen geht z.B. ohne...) |
Ja, und was passiert bitte intern bei solchen Operationen?
Da steckt mehr Pointerarithmetik hinter, als du dir vorstellen kannst.
Zitat :
|
Nicht jeder ist so ein Suchtie, dass er schneller ein Nibble korrekt (!) in ein Zeichen umrechnet und dieses eintippt als er für selbiges in Bitschreibweise braucht. |
C bietet gleich einen ganzen Satz an Möglichkeiten, sowas schön, verständlich, portabel, leserlich, schnell änderbar etc. auf Bitebene zu realisieren, man braucht halt mehr als die Standardahnung ums zu verstehen...
Und um irgendwelche Zeichen (du meinst versch. ASCII) gehts hier eh nicht, würde so auch nicht klappen, noch ein Grund, einfach nicht zu antworten.
Und grundsätzlich gilt: Programmierer denken hexadezimal. Man kann direkt die gesetzten Bits in einer hexadezimal-kodierten Zahl sehen.
Aber 0bxxx geht gar nicht, auch wenn der GCC nicht meckert.
gcc -pedantic:
t.c:5:20: Warnung: binäre Konstanten sind eine GCC-Erweiterung [standardmäßig aktiviert]
Der GCC bietet sehr viele Erweiterungen und unter Linux etc. mag das in Ordnung sein.
Aber jemand der das nutzt tut sich und anderen nicht immer einen Gefallen.
|
_________________
|
BID = 874467
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Offtopic :
|
Zitat :
DonComi hat am 17 Feb 2013 01:23 geschrieben :
|
Wir reden über ernsthaftes programmieren.
|
Ich bin mir nicht sicher, ob meine ~750 Zeilen in C wesentlich kürzer ausgefallen wären.
C will so mächtig sein, aber verzichtet auf diese simple und praktische Notation.
Kopf->Tisch
Zitat :
| (nicht immer brauch man Pointer, Pakete aus einer seriellen Schnittstelle einlesen, zerlegen und darstellen geht z.B. ohne...) |
Ja, und was passiert bitte intern bei solchen Operationen?
Da steckt mehr Pointerarithmetik hinter, als du dir vorstellen kannst.
[/quote]
Weiß ich selbst, nur zu Fuß nervts zumindest mich ziemlich...
Zitat :
|
C bietet gleich einen ganzen Satz an Möglichkeiten, sowas schön, verständlich, portabel, leserlich, schnell änderbar etc. auf Bitebene zu realisieren
|
Die da wäre?
Zitat :
|
Man kann direkt die gesetzten Bits in einer hexadezimal-kodierten Zahl sehen.
|
Also ich schaffs nur mit einer unpraktikablen Verzögerung...
_________________
|
[ Diese Nachricht wurde geändert von: ElektroNicki am 17 Feb 2013 2:48 ]
|
BID = 874479
basti2s Gelegenheitsposter
Beiträge: 94 Wohnort: Leutkirch
|
ich steuere die Ports halt mit 0bxxx an, weil ich es in der Schule so gelernt habe, und für mich momentan am einfachsten ist.
Aber warum funktioniert mein Code nicht?
|
BID = 874484
ffeichtinger Schreibmaschine
Beiträge: 1050 Wohnort: Traunkirchen im Salzkammergut
|
Zitat :
|
Und grundsätzlich gilt: Programmierer denken hexadezimal. Man kann direkt die gesetzten Bits in einer hexadezimal-kodierten Zahl sehen.
|
Also ich denke nicht hexadezimal, höchstens binär
Ich hab mal als Tutor an einem Institut gearbeitet wo sämtliche Kontrollregister (am DSP) immer hexadezimal gesetzt werden.
Warum bitte macht man sowas? Dafür gäbs doch die schöne Schreibweise mit:
(1<<BIT_SOUNDOS)|(1<<WASANDERES)
Für mich sind hex-Zahlen nur dann sinnvoll wenn sie nur aus 'F's bestehen.
Außerdem wird dort durchgängig mit C89 gearbeitet! Und das im Jahre 2013!
mfg Fritz
_________________
|
BID = 874486
Ltof Inventar
Beiträge: 9331 Wohnort: Hommingberg
|
Offtopic :
|
Zitat :
DonComi hat am 17 Feb 2013 01:23 geschrieben :
|
C bietet gleich einen ganzen Satz an Möglichkeiten, sowas schön, verständlich, portabel, leserlich, schnell änderbar etc. auf Bitebene zu realisieren, man braucht halt mehr als die Standardahnung ums zu verstehen...
|
Das hat irgendwie etwas Widersprüchliches.
Und:
Wenn ich PIC-Programme in C schreiben würde, würde ich diese Notation vermutlich auch verwenden.
Im übrigen steht es jedem frei, jede beliebige Programmiersprache nicht ernst zu nehmen - auch C.
( http://www.stupidedia.org/stupi/Div.....3%A4t http://www.stupidedia.org/stupi/Programmiersprache ) |
_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)
[ Diese Nachricht wurde geändert von: Ltof am 17 Feb 2013 11:08 ]
|
BID = 874494
Ltof Inventar
Beiträge: 9331 Wohnort: Hommingberg
|
Offtopic :
| Ach nee:
Zitat :
| Um den Wildwuchs zahlreicher Dialekte einzudämmen, wurde C mehrfach standardisiert (C89, C95, C99, ISO-C). Abgesehen vom Mikrocontrollerbereich, wo eigene Dialekte existieren, sind die meisten aktuellen PC-/Server-Implementierungen eng an den Standard angelehnt; eine vollständige Implementierung aktueller Standards ist aber selten. In den meisten C-Systemen mit Laufzeitumgebung steht auch die genormte Standard C Library zur Verfügung. Dadurch können C-Programme, die keine sehr hardware-nahe Programmierung enthalten, in der Regel gut auf andere Zielsysteme portiert werden. |
( http://de.wikipedia.org/wiki/C_%28P.....blick )
Oder anders herum formuliert: Auf µC-Systemen lassen sich die Standards ohnehin nicht Dialekt-frei umsetzen und eine Anpassung an ein neues Zielsystem ist erforderlich. |
_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)
|
BID = 874530
Nukeman Schriftsteller
Beiträge: 754 Wohnort: bei Kleve
|
Offtopic :
| Ich finde die Notation 0bxxxxxxxx eigentlich auch ganz praktisch. Benutze
sie wegen der Portierbarkeit aber nicht und Hex kann ich auch alle Bits
sofort ansehen.
Aber:
Warum die Zahlensysteme Dezimal, Oktal und Hexadezimal von C nativ unterstützt
werden und ausgerechnet das Binär-System nicht, ist für mich nicht ersichtlich.
Gerade die Unterstützung des Oktal-Systems halte ich für ziemlich überflüssig
und sogar fehlerträchtig. Such mal nach so einem Fehler: x=042; Da kann man
tagelang dran sitzen, wo die Variable den Wert 34 herbekommen hat..
Es gibt eigentlich keine priviligierten und unterpriviligierten Zahlensysteme,
nur mehr oder weniger sinnvoll einsetzbare.
|
Zum Code selbst schreibe ich nichts mehr, fang bitte nochmal mit den Grundlagen
an oder suche Dir ein passendes Online-Tutorial.
Gruß,
Stefan
_________________
Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat´s gemacht.
|
BID = 874541
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Zitat :
| (1<<BIT_SOUNDOS)|(1<<WASANDERES) |
Genau das meinte ich, das ist eine sehr praktikable Möglichkeit.
Und natürlich lassen sich Mikrocontroller dialektfrei programmieren, vor allem in C.
Beispielsweise nehmen wir mal den Ausdruck PORTC = 1<<PORTC4;
PORTC selbst ist ein Makro, welches auf einen volatilen Speicherbereich zeigt. Ein Zugriff erfolgt also via Dereferenzierung eines Pointers auf eine feste, durch Hardware veränderbare Adresse (volatile). Das ist völlig normaler C-Code.
1<<PORTC4 heißt in diesem Fall, schiebe eine 1 an die vierte Position, binär also 0b00010000, hex 0x10.
Wenn man ordentlich modularisiert kann man bestimmte Codezeilen durchaus ohne Änderung direkt auf einem anderen System laufen lassen. Die hardwarenahen Geschichten werden dann entsprechend gekapselt, sodass nur sie wirklich plattformabhängig sind.
Leider lernen die Wenigsten, diese Trennung wirklich ernst zu nehmen und konsequent umzusetzen.
Es gibt auch Projekte, wo das alles völlig egal ist, da muss es nur laufen. Da kann man auf Portabilität, Standardkonformität etc. gänzlich verzichten und dennoch sollte man dort Sachen wie Register = 0b11001001 vermeiden und lieber mit möglichst symbolischen Konstanten arbeiten, das erhöht die Verständlichkeit und die Chance, Änderungen schnell auch nach ein paar Jahren einpflegen zu können, erheblich.
Ich hatte grad letztens ein großes Projekt (auch für ein Institut...), wo genau diese Portabilität ein wichtiges Kriterium war. Gegeben war exakt eine Schnittstelle und die Tatsache, dass der Code auf Linux, Windows, MacOS laufen können muss.
Dank der Modularität könnte man unseren Teil hinter der Schnittstelle auch auf AVRs, ARMs und z.B. unter SymbianOS laufen lassen .
Der Aufwand war gar nicht deutlich größer, als es nur z.B. für Linux oder Windows zu schreiben.
@Ltof:
Zitat :
| Im übrigen steht es jedem frei, jede beliebige Programmiersprache nicht ernst zu nehmen - auch C. |
Du hast Recht, C ist nicht das Nonplusultra und BASIC wird ja tatsächlich für Embedded Systeme als Programmiersprache eingesetzt, so schlecht kann es also nicht sein.
Davon mal abgesehen: aus rein theoretischer Sicht ist es eh egal, welche Sprache man einsetzt. Am Ende geht es darum, dass der Mist das tut, was man will und die Rahmenbedingungen eingehalten werden.
Schnitzer wie eine Rakete aufgrund eines Underflows abstürzen zu lassen, bekommt man mit vielen Sprachen hin...
_________________
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag heute wurden bisher 11 Beiträge verfasst © x sparkkelsputz Besucher : 182389129 Heute : 3864 Gestern : 6874 Online : 547 24.11.2024 14:30 5 Besucher in den letzten 60 Sekunden alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0599269866943
|