Forum: Mikrocontroller und Digitale Elektronik Arm7 Grundlagen


von American D. (americandad)


Lesenswert?

Hallo,

ich soll mich für meine Firma, nebenbei, ein wenig in Richtung 
Mikrocontrollerprogrammierung weiterbilden, da man denkt das könnte man 
mal brauchen. Konkret hab ich dafür einen Arbeitstag/Woche 
freigeschaufelt bekommen. Habe etwas eingerostete, aber durchaus ganz 
gute C Kenntnisse.

Habe mich für einen Arm7 entschieden, also AT91SAM7x-EK, Rowley 
Crossstudio + Jtag Interface organisiert. Wollte erstmal mit FreeRTOS 
rumexperimentieren, den Code verstehen etc.

Jetzt, nach langem lesen in der Doku von Atmel wollte ich darauf 
aufbauen und sachen zum FreeRTOS ergänzen.

Von einem Sensor bekomme ich ein Signal, vondem die Zeit der einzelnen 
Peaks messen möchte.

Signal liegt am PIO Controller an.
Mit den Registern komme ich soweit klar.
Nur eine ganz blöde Frage habe ich, wie erkenne ich möglichst effektiv 
eine fallende Flanke an einem IO Pin?

Stells mir grad so vor:
1
for (;;){
2
 
3
 if (steigende Flanke kommt) {
4
  starte Timer TC0;
5
 }
6
 if (fallende Flanke kommt) {
7
  Timerwert TC0 = array[x];
8
  Timerreset TC0;
9
  x++;
10
}
Also mal ganz banal aufgeschrieben. Wie ich den Timer 
starte/stope/resete etc. ist mir alles klar. Nur wie lass ich den Timer 
am klügsten auf die Flanken reagieren?
   __________            ______
  /           \          /       \
 /|<-  t1  ->| \        / |< t2>| \
/               \______/           \___ usw.

Zeit t1 und t2 möchte ich messen, diese Zeite variieren.

( Aus irgendeinem Grund wird die "high level linie" durchgezeichnet, 
bitte unterbrochen vorstellen)

Wäre echt sehr dankbar für gute Ratschläge.

Da ich ja die Zeit habe mich sehr intensiv damit zu beschäftigen 
überlege ich auch irgendwann mal meine Erfahrungen zu einem kleinen 
Beginners Tutorial zusammenzufassen. Von einem dann hoffentlich 
ehemaligem Einsteiger für den Einsteiger... aber da ist es noch lang 
lang hin ;)

von Unbekannter (Gast)


Lesenswert?

1
void wait_rising_edge()
2
{
3
  while ( level == high )
4
    ;
5
  while ( level == low )
6
    ;
7
}

von American D. (americandad)


Lesenswert?

Naja das ist mir ja schon klar soweit, nur muss man das ja irgendwie 
greifen.
Also wie sag ich dem µC wann high level ist?
Vielleicht erlege ich gerade einem großen Denkfehler und es ist 
vermutlich nicht sonderlich schwer, aber irgendwie ist mir das nicht 
klar.

Also womit erkennt der µC das?

von Christian J. (elektroniker1968)


Lesenswert?

Hallo,

normalerweise macht man sowas aber mit den Capture/Compare Registern 
eines uC, die sind flankengesteuert. Der Code  da oben schmiert doch ab, 
wenn das Singla nicht kommt. Und da der ARM schöne 64 Bit Timer Register 
hat (zumindest der LPCxxx) kann man damit auch 22.000 Jahre Perioden 
messen :-)

Ach ja, für einen uC ist HIGH dann, wenn die Spannung am Pin über der 
Threshold Voltage liegt und die für jeden Bereich 1,8V , 3.3V, TTL 
anders.

von Peter (Gast)


Lesenswert?

Als erstes muss man mal die Randbedingungen festhalten.
Welche Wiederholfrequenz hat das Signal?
Mit welcher Auflösung möchte ich messen?
Welches sind die kürzesten und längsten Peaks die vorkommen und 
ausgewertet werden sollen?
Soll der Rechner "parallel" noch was Anderes machen? Oder darf er sich 
ganz dieser Aufgabe widmen (wenig Praxisgerecht)?
Erst wenn das geklärt ist, kann man entscheiden, ob man mit Pollen 
zurechtkommt oder ob man mit Hardwareeinheiten (Capture/Compare) 
arbeiten kann oder sogar muss.

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.